背景
.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。
最后,还需要将验证类注册到服务中。修改Start