在.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