视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
.NET验证组件Fluent Validation使用指南
2020-11-27 22:38:46 责编:小采
文档

认识Fluent Vaidation.

  看到NopCommerce项目中用到这个组建是如此的简单,将数据验证从业务实体类中分离出来,真是一个天才的想法,后来才知道这个东西是一个开源的轻量级验证组建。
 
  Fluent Validation 翻译为:流畅验证
 
  开源Codeplex其主页简介:该组件是一个轻量级的.NET类库,使用流畅的接口定义和lambda表达式为构建一个业务类的验证规则(A small validation library for .NET that uses a fluent interface and lambda expression for building validation rules for you business objects.)
 
  这个类库不仅仅可以使用的asp.net mvc项目中,普通的类库中也可以使用,当然在asp.net form项目中也支持。

怎么使用:  
  是不是好用,还要看使用时是否真的像其官网建议描述一样。我比较喜欢其官网上的例子,一眼就能看出用法上的感觉,绝对是如其名,流畅,这个也一种解释型语言常见的的一种用法,无限的对一个类型支持无限度个属性扩展。

业务实体类:
 
代码如下:
 public class Person
 {
     public string NameField;
     public int Id { get; set; }
     public string Surname { get; set; }
     public string Forename { get; set; }
     public List<Person> Children { get; set; }
     public string[] NickNames { get; set; }
     public DateTime DateOfBirth { get; set; }
     public int? NullableInt { get; set; }
     public Person()
     {
         Children = new List<Person>();
         Orders = new List<Order>();
     }
     public int CalculateSalary()
     {
         return 20;
     }
     public Address Address { get; set; }
     public IList<Order> Orders { get; set; }
     public string Email { get; set; }
     public decimal Discount { get; set; }
     public double Age { get; set; }
     public int AnotherInt { get; set; }
     public string CreditCard { get; set; }
     public int? OtherNullableInt { get; set; }
 }
 public interface IAddress
 {
     string Line1 { get; set; }
     string Line2 { get; set; }
     string Town { get; set; }
     string County { get; set; }
     string Postcode { get; set; }
     Country Country { get; set; }
 }
 public class Address : IAddress
 {
     public string Line1 { get; set; }
     public string Line2 { get; set; }
     public string Town { get; set; }
     public string County { get; set; }
     public string Postcode { get; set; }
     public Country Country { get; set; }
     public int Id { get; set; }
 }
 public class Country
 {
     public string Name { get; set; }
 }
 public interface IOrder
 {
     decimal Amount { get; }
 }
 public class Order : IOrder
 {
     public string ProductName { get; set; }
     public decimal Amount { get; set; }
 }

对Person的指定验证规则:  
 
代码如下:
 using FluentValidation;
 public class CustomerValidator: AbstractValidator<Customer>
 {
   public CustomerValidator()
   {
     RuleFor(customer => customer.Surname).NotEmpty();
     RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
     RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
     RuleFor(customer => customer.Address).Length(20, 250);
     RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
   }
   private bool BeAValidPostcode(string postcode)
   {
     // custom postcode validating logic goes here
   }
 }
 // 手动验证规则
 Customer customer = new Customer();
 CustomerValidator validator = new CustomerValidator();
 ValidationResult results = validator.Validate(customer);
 bool validationSucceeded = results.IsValid;
 IList<ValidationFailure> failures = results.Errors;

Flent validation怎么与asp.net mvc验证库整合?
  如果在asp.net mvc中现实中这么用,可能会有很多人不会知道他,我们知道Asp.net MVC项目中有自己的验证机构[企业库VAB(Validation Application Block),基于Attribute声明式验证],其使用方法,也被我们都一直很认可,但其也有很多不够灵活的,但Fluent Validation确实更灵活一点。使用起来多变性,流畅,而且验证规则是一个单独的类,是和业务实体对象分类的,我们不需要翔VAB一样,需要在业务实体类上使用Attribute注册验证规则。
 
  既然其不是ASP.NET MVC的默认验证规则类库,我们就需要注册到ASP.NET MVC的验证规则库中。
 
代码如下:
 // 在Global.asax.cs中的Applicaton_Start()函数中注册为asp.net mvc默认的验证规则库。
 // fluent validation
 FluentValidationModelValidatorProvider provider = new FluentValidationModelValidatorProvider(new AttributedValidatorFactory());
 ModelValidatorProviders.Providers.Add(provider);
 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

注意:
  1,)作为Fluent Validation验证规则类须继承AbstractValidator<T>;
 
  2,)我们也可以仿照NopCommerce的处理方法,对AttributeValidatorFactory类的Validator(Type type)函数重写,在特殊的业务环境下支持其他验证规则。

本文适合对.net以及MVC有所了解的读者,这里抛砖引玉,献丑了

下载本文
显示全文
专题