FluentValidation模块支持在ASP.NET Core项目中进行手工或自动验证,主要验证方式包括以下三种:
1)手工注册验证类,并在控制器或其它模块中调用验证;
2)基于ASP.NET验证管道(validation pipeline)自动验证;
3)基于过滤器自动验证。
定义以下数据类及验证类,学习并测试上述三种验证方式:
//数据类及验证类定义
public class AppUser
{
public string UserName { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
public class AppUserValidator : AbstractValidator<AppUser>
{
public AppUserValidator()
{
RuleFor(r => r.UserName).NotEmpty().WithMessage("姓名不能为空");
RuleFor(r => r.Age).GreaterThan(10).WithMessage("年龄必须超过10岁");
RuleFor(r => r.Email).EmailAddress();
}
}
首先是手工注册及验证,新建WebApi项目,在Program文件中手工注册验证接口及对应验证类,然后在控制器中调用验证,示例代码及效果如下所示。除了手工注册,FluentValidation还提供自动注册函数,不需要手工逐个注册,详细介绍见下面代码中的注释。
//program.cs中注册
//这里也可以安装FluentValidation.DependencyInjectionExtensions包,然后
//在program.cs中调用builder.Services.AddValidatorsFromAssemblyContaining<AppUserValidator>();
//AddValidatorsFromAssemblyContaining函数会将AppUserValidator所在程序集中
//所有继承自IValidator的验证类自动注册
builder.Services.AddScoped<IValidator<AppUser>, AppUserValidator>();
//controller类中使用
public class UserController : ControllerBase
{
private readonly IValidator<AppUser> _user;
public UserController(IValidator<AppUser> user)
{
_user = user;
}
[HttpPost]
public string NewUser(AppUser user)
{
FluentValidation.Results.ValidationResult result= _user.Validate(user);
if (result.IsValid)
{
return "验证成功";
}
else
{
return result.ToString();
}
}
}
第二种方式是基于ASP.NET验证管道自动验证,但FluentValidation官网文档中已不推荐这种方式,原因包括以下几点:
a)ASP.NET验证管道不支持异步,如果验证类中有异步操作,则验证类无法执行且会抛异常;
b)验证管道仅支持MVC和Razor,不支持Minimal APIs、Blazor等;
c)难以调试。自动验证模式难以调试程序问题。
基于ASP.NET验证管道自动验证时,只需在Program文件中调用AddFluentValidationAutoValidation函数(需安装FluentValidation.AspNetCore包)并注册验证接口及对应验证类即可。ASP.NET Core项目在调用控制器函数前会自动调用验证类进行验证。示例代码及运行效果如下所示:
//program.cs中注册
builder.Services.AddFluentValidationAutoValidation();
builder.Services.AddValidatorsFromAssemblyContaining<AppUserValidator>();
基于过滤器自动验证 需安装SharpGrip.FluentValidation.AutoValidation 包(详细介绍见参考文献3),该包的使用方式和基于ASP.NET验证管道自动验证类似,只需在program文件中添加相应函数即可,示例代码如下所示:
//program.cs中注册
using SharpGrip.FluentValidation.AutoValidation.Mvc.Extensions;
builder.Services.AddFluentValidationAutoValidation();
builder.Services.AddValidatorsFromAssemblyContaining<AppUserValidator>();
参考文献:
[1]https://docs.fluentvalidation.net/en/latest/start.html
[2]https://github.com/FluentValidation/FluentValidation.AspNetCore#aspnet-core-integration-for-fluentvalidation
[3]https://github.com/SharpGrip/FluentValidation.AutoValidation