在.Net6 中使用 FluentValidation

本文仅演示 FluentValidation 的手动调用验证的方式,不涉及自动验证的方式

1、引用Nuget包:FluentValidation.AspNetCore;

2、依赖注入:

builder.Services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly());

Assembly.GetExecutingAssembly()指定自定义验证器所在的程序集(此处是当前程序集);
这样的话,程序会自动把程序集中所有自定义validator批量注册到容器中,无需一个一个的注册;
默认生命周期是Scope,当然你也可以在注册的时候手动指定生命周期:
 1 services.AddValidatorsFromAssemblyContaining<UserValidator>(ServiceLifetime.Transient); 


或者如果想在批量自动注册时排除某些validator,可以使用以下方法:

1       builder.Services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly(),
2         ServiceLifetime.Scoped,
3         filter => filter.ValidatorType != typeof(CustomerValidator));

3、自定义验证器:继承自 AbstractValidator<T>,其中T表示要验证的模型;然后在构造函数中用FluentAPI的方式设置校验规则进行模型验证;也可以在构造函数中注入其它的外部服务进行验证(如注入DBContext 查询数据库判断手机号是否已存在);

1   public class UserValidator : AbstractValidator<AddUserForm>
2   {
3     public UserValidator()
4     {
5       RuleFor(u => u.PhoneNumber).NotEmpty().Matches("/^1d{9}$/").WithMessage("无效的手机号码");
6     }
7   }

4、手动调用:(官方不推荐自动验证的方式)

通过构造函数注入的方式,调用自定义的验证器类;调用IsValid方法获取验证是否通过,错误信息存储在 ValidationResult.Errors 中,可以进行遍历输出所有的错误提示或者调用 ValidationResult的ToString() 扩展方法一次性全部输出错误提示(默认使用换行分隔每个错误提示,也可以自己传入分隔符,例如使用逗号分隔 ValidationResult.ToString(","));

注意:1、如果定义的Validator中有使用异步的验证方法如MustAsync、WhenAsync等,手动验证时必须调用异步的ValidateAsync方法而不是同步的Validate方法,否则会抛出异常。 

2、如果是自动验证的话,在定义的Validator中不要使用异步的验证方法(规则),因为ASP.NET 的验证管道是非异步的,在FluentValidation10.0或之前的版本中会以同步的方式执行,在最新的版本中会抛出异常;

 

 

 

 参考资料:ASP.NET Core — FluentValidation documentation

 

posted @ 2023-04-07 15:34  开心的菜鸟程序猿  阅读(808)  评论(0编辑  收藏  举报