在.NET Core 中使用 FluentValidation 进行规则验证的方法
不用说,规则验证很重要,无效的参数,可能会导致程序的异常。
如果使用WebAPI或MVC页面,那么可能习惯了自带的规则验证,我们的控制器很干净:
publicclassUser
{
[Required]
publicstringFirstName{get;set;}
[Required]
publicstringLastName{get;set;}
}
这种很常见,但是今天我想给你一个更好的替代方案:FluentValidation,通过这个库,您可以流畅地定义用于对象验证的复杂规则,从而轻松构建和理解验证规则,您可以在Github上找到这个项目。
安装FluentValidation
我新建了一个很简单的.NETCore的WebAPI程序,只有一个接口是用户注册,入参是一个User类,然后在Nuget中安装FluentValidation。
创建第一个验证
对于要验证的每个类,必须创建其自己的验证器,每个验证器类都必须继承AbstractValidator
最简单的验证是针对空值,如果要指定FirstName和LastName都不能为空,这个验证器是这样:
publicclassUserValidator:AbstractValidator{ publicUserValidator() { RuleFor(x=>x.FirstName).NotEmpty(); RuleFor(x=>x.LastName).NotEmpty(); } }
就这些了,您已经创建了第一个验证器,是不是超级简单!
还有一些其他的规则,比如MinimumLength,MaximumLength和Length,用于验证长度,您可以把多个规则指定到一个字段,就像这样:
publicclassUserValidator:AbstractValidator{ publicUserValidator() { RuleFor(x=>x.FirstName).NotEmpty(); RuleFor(x=>x.FirstName).MinimumLength(3); RuleFor(x=>x.FirstName).MaximumLength(20); RuleFor(x=>x.LastName).NotEmpty(); } }
验证入参
我们之前已经定义了验证规则,现在开始使用它,您只需要new一个UserValidator对象,然后调用Validate方法,它会返回一个对象,其中包含了验证状态和所有没有通过验证的信息。
[HttpPost]
publicIActionResultRegister(UsernewUser)
{
varvalidator=newUserValidator();
varvalidationResult=validator.Validate(newUser);
if(!validationResult.IsValid)
{
returnBadRequest(validationResult.Errors.First().ErrorMessage);
}
returnOk();
}
如果我运行程序,然后输入一个超长的名字:
{
"FirstName":"赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张",
"LastName":"张"
}
我会收到验证错误:"Thelengthof'FirstName'mustbe20charactersorfewer.Youentered24characters"。
好吧,我不喜欢这个消息,那么你可以自定义错误消息,这很简单,您可以使用WithMessage方法。
-RuleFor(x=>x.FirstName).MaximumLength(20);
+RuleFor(x=>x.FirstName).MaximumLength(20).WithMessage("您的名字长度已经超出了限制!");
流利验证
你可以把验证规则,改成下边这样:
-RuleFor(x=>x.FirstName).NotEmpty(); -RuleFor(x=>x.FirstName).MinimumLength(3); +RuleFor(x=>x.FirstName).NotEmpty().MinimumLength(3);
然后也可以把验证规则应用于其他的属性,就像这样:
publicUserValidator()
{
RuleFor(x=>x.FirstName)
.MaximumLength(20).WithMessage("您的名字长度已经超出了限制!")
.NotEmpty().MinimumLength(3);
RuleFor(x=>x.LastName).NotEmpty();
}
常见的验证规则
这个库有很多现成的基本类型验证规则,对于字符串,您可以使用不同的方法,比如EmailAddress,IsEnumName(检查值是否在指定的Enum类型中定义)和InclusiveBetween,检查该值是否在定义的范围内。
现在,我在User类添加了另外两个字段,Password和ConfirmPassword。
Password字段是一个字符串,有效的长度必须在5到15个字符之间,并且要符合正则,为了定义是否满足安全规则,我定义了一个HasValidPassword方法,它会返回一个bool值。
privateboolHasValidPassword(stringpw)
{
varlowercase=newRegex("[a-z]+");
varuppercase=newRegex("[A-Z]+");
vardigit=newRegex("(\\d)+");
varsymbol=newRegex("(\\W)+");
return(lowercase.IsMatch(pw)&&uppercase.IsMatch(pw)&&digit.IsMatch(pw)&&symbol.IsMatch(pw));
}
然后在密码验证中使用:
RuleFor(x=>x.FirstName)
.MaximumLength(20).WithMessage("您的名字长度已经超出了限制!")
.NotEmpty().MinimumLength(3);
RuleFor(x=>x.LastName).NotEmpty();
RuleFor(x=>x.Password)
.Length(5,15)
.Must(x=>HasValidPassword(x));
还可以简化一些:
RuleFor(x=>x.Password) .Length(5,15) - .Must(x=>HasValidPassword(x)); + .Must(HasValidPassword); }
ConfirmPassword字段的唯一要求是等于Password字段:
RuleFor(x=>x.ConfirmPassword)
.Equal(x=>x.Password)
.WithMessage("2次密码不一致!");
注入验证器
修改Startup类中的ConfigureServices方法:
publicvoidConfigureServices(IServiceCollectionservices)
{
services.AddControllers().AddFluentValidation();
services.AddTransient,UserValidator>();
}
注意:这个地方的生命周期是Transient。
这样,在调用注册接口的时候,会自动进行规则验证:
[HttpPost]
publicIActionResultRegister(UsernewUser)
{
returnOk();
}
然后,我们再尝试传入参数来调用接口:
{
"FirstName":"赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张",
"LastName":"张"
}
很明显,验证不通过,接口会返回这样的错误信息:
{
"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title":"Oneormorevalidationerrorsoccurred.",
"status":400,
"traceId":"|c4523c02-4899b7f3df86a629.",
"errors":{
"FirstName":[
"您的名字长度已经超出了限制!"
]
}
}
希望对您有帮助,您可以在官方文档中找到更多的用法。
原文链接:https://www.code4it.dev/blog/fluentvalidation
到此这篇关于在.NETCore中使用FluentValidation进行规则验证的文章就介绍到这了,更多相关.NETCore规则验证内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。