FluentValidation创建第一个验证类

为验证某个特定的模型,我们需要创建一个继承于 AbstractValidator<T> 的类,这个T就是我们需要校验的类(class).

比如,我们有如下这样的一个Customer 类

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; }
}

你如果想为上面的类定义一些验证的规则的话,你可以创建出如下的一个类

using FluentValidation;

public class CustomerValidator : AbstractValidator<Customer>
{
}

验证规则必须被定义在构造函数里面

如果你要为某个属性定义某个验证规则的话。你可以调用RuleFor方法,并传入一个 lambda 表达式 例如,如果我们想要验证 Surname不能为Null的话。 我们可以创建出如下的代码

using FluentValidation;

public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator() 
  {
    RuleFor(customer => customer.Surname).NotNull();
  }
}

现在我们来看一下,如保使用刚才哪个类来进行验证。(在Asp.net core 当中我们会有更方便的方式,不需要这样显示来调用。) 如果对这个验证类写单元测试的话,我们也可以用这种方式。 实例化一个CustomerValidator 调用方法Validate来进行验证

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();

ValidationResult result = validator.Validate(customer);

这个方法会返回一个 ValidationResult的对象, 这个对象包含两个属性

  1. IsValid bool在类型。 验证成功为true
  2. Errors 一个字符串集合,含有详细的错误信息 下面的这个代码可以把所有的错误在控制台里面打印出来
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);
  }
}

我们也可以把所有的错识信息拼接成一个,默认情况下这个拼接符是换行 如果我们想自己处理的话,我们可以通过传入参数的方式来控制它

ValidationResult results = validator.Validate(customer);
string allMessages = results.ToString("~");     // 错识消息与 "~"拼在一起

注意:如果没有任何错误的话。这个会返回一个空字符串。

链式验证器 Chaining validators

我们可以把多个验证规则连在一起来验证某个属性

using FluentValidation;

public class CustomerValidator : AbstractValidator<Customer>
{
  public CustomerValidator()
  {
    RuleFor(customer => customer.Surname).NotNull().NotEqual("foo");
  }
}

抛出异常

除了返回 ValidationResult,我们还可以在验证没通过的时候直接让 FluentValidation 抛出异常

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();

validator.ValidateAndThrow(customer);

这个方法会抛出一个异常 ValidationException 错误消息都放在了Errors里面. 注意 ValidationAndThrow 是一个扩展方法,我们必须 添加 FluentValidation namespace

这个方法等价于

validator.Validate(customer, options => options.ThrowOnFailures());

如果在使用RuleSets的时候还打算抛出异常的时候,我们可以用下面的方法

validator.Validate(customer, options => {
  options.ThrowOnFailures();
  options.IncludeRuleSets("MyRuleSets");
  options.IncludeProperties(x => x.Name);
});
最近更新的
...