FluentValidation创建第一个验证类
为验证某个特定的模型,我们需要创建一个继承于 AbstractValidator<T> 的类,这个T就是我们需要校验的类(class).
比如,我们有如下这样的一个Customer 类
csharp
public class Customer
{
public int Id { get; set; }
public string Surname { get; set; }
public string Forename { get; set; }
public decimal Discount { get; set; }
public string Address { get; set; }
}你如果想为上面的类定义一些验证的规则的话,你可以创建出如下的一个类
csharp
using FluentValidation;
public class CustomerValidator : AbstractValidator<Customer>
{
}验证规则必须被定义在构造函数里面
如果你要为某个属性定义某个验证规则的话。你可以调用RuleFor方法,并传入一个 lambda 表达式 例如,如果我们想要验证 Surname不能为Null的话。 我们可以创建出如下的代码
csharp
using FluentValidation;
public class CustomerValidator : AbstractValidator<Customer>
{
public CustomerValidator()
{
RuleFor(customer => customer.Surname).NotNull();
}
}现在我们来看一下,如保使用刚才哪个类来进行验证。(在Asp.net core 当中我们会有更方便的方式,不需要这样显示来调用。) 如果对这个验证类写单元测试的话,我们也可以用这种方式。 实例化一个CustomerValidator 调用方法Validate来进行验证
csharp
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult result = validator.Validate(customer);这个方法会返回一个 ValidationResult的对象, 这个对象包含两个属性
- IsValid bool在类型。 验证成功为true
- Errors 一个字符串集合,含有详细的错误信息 下面的这个代码可以把所有的错误在控制台里面打印出来
csharp
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
if(! results.IsValid)
{
foreach(var failure in results.Errors)
{
Console.WriteLine("Property " + failure.PropertyName + " failed validation. Error was: " + failure.ErrorMessage);
}
}我们也可以把所有的错识信息拼接成一个,默认情况下这个拼接符是换行 如果我们想自己处理的话,我们可以通过传入参数的方式来控制它
csharp
ValidationResult results = validator.Validate(customer);
string allMessages = results.ToString("~"); // 错识消息与 "~"拼在一起注意:如果没有任何错误的话。这个会返回一个空字符串。
链式验证器 Chaining validators
我们可以把多个验证规则连在一起来验证某个属性
csharp
using FluentValidation;
public class CustomerValidator : AbstractValidator<Customer>
{
public CustomerValidator()
{
RuleFor(customer => customer.Surname).NotNull().NotEqual("foo");
}
}抛出异常
除了返回 ValidationResult,我们还可以在验证没通过的时候直接让 FluentValidation 抛出异常
csharp
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
validator.ValidateAndThrow(customer);这个方法会抛出一个异常 ValidationException 错误消息都放在了Errors里面. 注意 ValidationAndThrow 是一个扩展方法,我们必须 添加 FluentValidation namespace
这个方法等价于
csharp
validator.Validate(customer, options => options.ThrowOnFailures());如果在使用RuleSets的时候还打算抛出异常的时候,我们可以用下面的方法
csharp
validator.Validate(customer, options => {
options.ThrowOnFailures();
options.IncludeRuleSets("MyRuleSets");
options.IncludeProperties(x => x.Name);
});