如何使用Fluent Validator为返回Task的属性设置自定义验证器
异步返回列表属性的自定义验证器配置方案
存在无需调用.Result的实现方案,FluentValidation 原生支持异步属性的验证处理,可完全避免阻塞调用带来的死锁风险和性能损耗。
推荐实现(适用于 FluentValidation 11 及以上版本)
使用框架提供的TransformAsync方法,可直接对返回Task的属性做异步转换,自动await任务拿到返回结果,无需手动阻塞调用。
配置代码如下:
RuleForEach(x => x.Property) .TransformAsync(async (listTask, cancellationToken) => { return await listTask.ConfigureAwait(false); }) .SetValidator(new MyComplexValidator());
注意事项
- 配置完成后触发验证时,必须调用异步验证方法
await validator.ValidateAsync(yourModel),不能使用同步的Validate()方法,否则异步规则会被跳过不执行。 - 若需要验证取消能力,可将CancellationToken传入
ValidateAsync方法,令牌会自动传递到TransformAsync的委托中。
低版本兼容实现(适用于 FluentValidation 11 以下版本)
如果使用的框架版本不支持TransformAsync,可以通过CustomAsync方法手动实现等效逻辑:
RuleFor(x => x.Property) .CustomAsync(async (listTask, context, cancellationToken) => { IList<ComplexType> list = await listTask.ConfigureAwait(false); var validator = new MyComplexValidator(); for (int i = 0; i < list.Count; i++) { var itemResult = await validator.ValidateAsync(list[i], cancellationToken); if (!itemResult.IsValid) { foreach (var error in itemResult.Errors) { context.AddFailure($"Property[{i}].{error.PropertyName}", error.ErrorMessage); } } } });
原写法风险说明
你之前使用.Result的阻塞调用写法,在存在同步上下文的环境(比如ASP.NET Core、WPF等)中非常容易触发死锁,同时会阻塞线程降低服务吞吐性能,使用框架原生的异步验证方案可以完全规避这类问题。
内容的提问来源于stack exchange,提问作者sree
相关产品推荐
相关产品推荐

