客官,.NETCore无代码侵入的模型验证了解下

.NETCore下的模型验证相信绝大部分的.NET开发者或多或少的都用过,微软官方提供的模型验证相关的类位于System.ComponentModel.DataAnnotations命令空间下,在使用的时候只需要给属性添加不同的特性即可实现对应的模型验证。如下所示:

public class Movie { public int Id { get; set; } [Required] [StringLength(100)] public string Title { get; set; } }

在WebApi中,当请求接口时,程序会自动对模型进行验证,如无法验证通过,则会直接终止后续的逻辑执行,并响应400状态码,响应内容如下所示:

{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "00-4b16460fc83d7b4daa4f10d939016982-f823eebede419a4a-00", "errors": { "aa": [ "The aa field is required." ] } }

当然,你也可以自定义响应的内容,这不是本文的重点。本文的重点是,.NETCore系统默认的模型验证功能并不够强大,仅支持在Controller的Action中使用,不支持非Controller中或者控制台程序的验证,且代码侵入性较强。

而FluentValidation(https://fluentvalidation.net/ )则是功能更为强大的模型验证框架,支持任何场景下的模型验证,且不侵入代码。

下面就来和笔者一起了解下FluentValidation的用法。

接入

FluentValidation支持一下平台:

.NET 4.6.1+

.NET Core 2.0+

.NET Standard 2.0+

各个平台的集成方式大同小异,本文仅讲解.NETCore3.1的集成方式。

首先,使用NuGet安装FluentValidation.AspNetCore依赖。

添加需要验证的模型类,如Student类,代码如下:

public class Student { public int Id { get; set; } public int Age { get; set; } public string Name { get; set; } }

然后创建类StudentValidator,并集成类AbstractValidator,代码如下:

public class StudentValidator : AbstractValidator<Student> { public StudentValidator() { RuleFor(x => x.Age).InclusiveBetween(10, 50); RuleFor(x => x.Name).NotEmpty().MaximumLength(5); } }

上述的验证类中,要求Age大于10且小于50,Name不为空,且长度小于5。

最后,还需要将验证类注册到服务中。修改Startup的ConfigureServices,部分代码如下:

services.AddControllers().AddFluentValidation(conf => { conf.RegisterValidatorsFromAssemblyContaining<StudentValidator>(); conf.RunDefaultMvcValidationAfterFluentValidationExecutes = false; });

上述代码中,RegisterValidatorsFromAssemblyContaining方法的作用是扫描StudentValidator类所在的程序集中的所有验证类,并注册到服务中。

RunDefaultMvcValidationAfterFluentValidationExecutes为false时,会屏蔽掉系统默认的模型验证,如需兼容系统默认的模型验证,将RunDefaultMvcValidationAfterFluentValidationExecutes的值改为true即可。此参数默认为true。

下面在Controller中,添加一个Action,代码如下:

[HttpPost] public IActionResult Add([FromBody] Student student) { return Ok(student); }

打开swagger,访问接口,响应如下所示:

{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "00-6331a76578228b4cb9044aa40f514bc9-89fd8547c1921340-00", "errors": { "Age": [ "'Age' 必须在 10 (包含)和 25 (包含)之间, 您输入了 0。" ], "Name": [ "'Name' 必须小于或等于5个字符。您输入了6个字符。" ] } }

至此,在 ASP.NET Core中集成FluentValidation就完成了。但到现在为止,这和系统默认的模型验证并没有区别。 在文章的开头笔者也提到过,FluentValidation不仅支持Controller中对模型进行验证,下面的代码就是非Controller场景下的验证。

public class DemoService { private readonly IValidator<Student> _studentValidator; public DemoService(IValidator<Student> studentValidator) { _studentValidator = studentValidator; } public bool Run(Student student) { var valid = _studentValidator.Validate(student); return valid.IsValid; } }

在上述代码中,通过构造函数注入的方式,获取到了IValidator实例,在Run方法中只需要调用Validate方法,参数是需要验证的对象,返回的对象就包含了验证的是否通过以及不通过时,具体的错误信息。

基础用法 内置规则

FluentValidation内置了多个常用的验证器,下面简单介绍几个特别常用或容易出错的验证器。

NotNull 和 NotEmpty

NotNull是确保指定的属性不为null,NotEmpty则表示确保指定的属性不为null、空字符串或空白(值类型的默认值,比如int类型的默认值为0),如果int类型属性设置NotEmpty验证器,则当值为0时,验证是无法通过的。

NotEqual 和 Equal

NotEqual 和 Equal分别是不相等和相等验证器,可与指定的值或者指定的属性进行比较。

MaximumLength、MinimumLength和Length

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspggp.html