数据校验 FluentValidation
大约 1 分钟
数据校验 FluentValidation
内置数据校验
- .NET Core 中内置了对数据校验的支持,在
System.ComponentModel.DataAnnotations
命名空间 - 内置验证特性:https://learn.microsoft.com/zh-cn/dotnet/api/system.componentmodel.dataannotations?view=net-7.0
- 内置校验的缺点:校验规则都是和模型类耦合,违反“单一职责原则”
FluentValidation
- 类似于 EF Core 中
Fluent API
的方式进行校验规则的配置 - 把对模型类的校验放到单独的校验类中
- 参考资料:https://docs.fluentvalidation.net/en/latest/aspnet.html
使用步骤
安装依赖包:
Install-Package FluentValidation.AspNetCore
编写验证类
public class LoginRequestVolidator : AbstractValidator<LoginRequest> { public LoginRequestVolidator() { RuleFor(request => request.Username).Length(6, 20) .Matches(@"\w*").WithMessage("用户名必须为6~20为字母、数字、下划线"); RuleFor(request => request.Password).Length(6, 16) .WithMessage("密码长度必须为6~16位") .Matches(@"[0-9]+").Matches(@"[a-z]+").Matches(@"[A-Z]+").Matches(@"[^\s\w]+") .WithMessage("密码必须包含数字、大写字母、小写字母、特殊符号"); } }
注册服务
// 注册验证器 LoginRequestVolidator 用于验证 LoginRequest 数据 services.AddScoped<IValidator<LoginRequest>, LoginRequestVolidator>(); // 添加包含 LoginRequestVolidator 验证器的程序集下的所有验证器 services.AddValidatorsFromAssemblyContaining<LoginRequestVolidator>(); // 自动验证, 将自定义验证器整合进 mvc 自动验证管道 // services.AddFluentValidationAutoValidation();
添加验证的两种方式:
- 【官方推荐】手动验证:直接、可靠
- 通过控制器中使用构造函数注入验证器
- 在 Action 中调用验证器进行验证
- 自动验证:兼容旧版本,只有通过验证才会执行 Action
- 不能执行异步操作
- 只能适用于 mvc
- 不利于调试
- 【官方推荐】手动验证:直接、可靠
手动验证
public class StudentsController : ControllerBase
{
private readonly IValidator<LoginRequest> _validator;
public StudentsController(IValidator<LoginRequest> validator)
{
this._validator = validator;
}
[HttpPost("Login")]
public async Task<ActionResult> Login(LoginRequest request)
{
ValidationResult result =await _validator.ValidateAsync(request);
return result.IsValid? Ok("登录成功"):BadRequest(result.Errors);
}
}