.net内置数据校验机制,在项目代码中发现很多地方使用了特性校验。
1、.NET Core中内置了对数据校验的支持,在System.ComponentModel.DataAnnotations这个命名空间下,比如[Required]、[EmailAddress] 、[RegularExpression]。CustomValidationAttribute、IValidatableObject。
2、演示其在ASP.NET Core中请求中的使用。
3、内置的校验机制的问题:校验规则都是和模型类耦合在一起,违反“单一职责原则”;很多常用的校验都需要编写自定义校验规则,而且写起来麻烦。
建议使用FluentValidation
1、FluentValidation:用类似于EF Core中Fluent API的方式进行校验规则的配置,也就是我们可以把对模型类的校验放到单独的校验类中。
2、 FluentValidation在ASP.NET Core项目中的用法
1)NuGet:FluentValidation.AspNetCore
2)注入服务
builder.Services.AddFluentValidation(fv => {
Assembly assembly = Assembly.GetExecutingAssembly();
fv.RegisterValidatorsFromAssembly(assembly);
// RegisterValidatorsFromAssemblies
3 编写模型类Login2Request
public record Login2Request(string Email, string Password, string Password2);
4)编写继承自AbstractValidator的数据校验类
public class Login2RequestValidator: AbstractValidator<Login2Request>
// 看这里的泛型 傻逼
{
public Login2RequestValidator()
{
RuleFor(x=>x.Email).NotNull().EmailAddress()
.Must(v=>v.EndsWith("@qq.com")||v.EndsWith("@163.com"))
.WithMessage("只支持QQ和163邮箱");
RuleFor(x => x.Password).NotNull().Length(3, 10)
.WithMessage("密码长度必须介于3到10之间")
.Equal(x => x.Password2)
.WithMessage("两次密码必须一致");
}
}
5)用Login2Request做Action方法的参数。