.NET業務實體類驗證組件Fluent Validation


  • 認識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項目中也支持。

  • 怎么使用:  

  是不是好用,還要看使用時是否真的像其官網建議描述一樣。我比較喜歡其官網上的例子,一眼就能看出用法上的感覺,絕對是如其名,流暢,這個也一種解釋型語言常見的的一種用法,無限的對一個類型支持無限度個屬性擴展。

     業務實體類:

 1 public class Person 
 2 {
 3     public string NameField;
 4     public int Id { get; set; }
 5     public string Surname { get; set; }
 6     public string Forename { get; set; }
 7 
 8     public List<Person> Children { get; set; }
 9     public string[] NickNames { get; set; }
10         
11     public DateTime DateOfBirth { get; set; }
12 
13     public int? NullableInt { get; set; }
14 
15     public Person() 
16     {
17         Children = new List<Person>();
18         Orders = new List<Order>();
19     }
20     
21     public int CalculateSalary()
22     {
23         return 20;
24     }
25 
26     public Address Address { get; set; }
27     public IList<Order> Orders { get; set; }
28 
29     public string Email { get; set; }
30     public decimal Discount { get; set; }
31     public double Age { get; set; }
32     public int AnotherInt { get; set; }
33 
34     public string CreditCard { get; set; }
35 
36     public int? OtherNullableInt { get; set; }
37 }
38 
39 public interface IAddress 
40 {
41     string Line1 { get; set; }
42     string Line2 { get; set; }
43     string Town { get; set; }
44     string County { get; set; }
45     string Postcode { get; set; }
46     Country Country { get; set; }
47 }
48 
49 public class Address : IAddress 
50 {
51     public string Line1 { get; set; }
52     public string Line2 { get; set; }
53     public string Town { get; set; }
54     public string County { get; set; }
55     public string Postcode { get; set; }
56     public Country Country { get; set; }
57     public int Id { get; set; }
58 }
59 
60 public class Country
61 {
62     public string Name { get; set; }
63 }
64 
65 public interface IOrder 
66 {
67     decimal Amount { get; }
68 }
69 
70 public class Order : IOrder 
71 {
72     public string ProductName { get; set; }
73     public decimal Amount { get; set; }
74 }

  對Person的指定驗證規則:  

 1 using FluentValidation;
 2 
 3 public class CustomerValidator: AbstractValidator<Customer>
 4 {
 5   public CustomerValidator() 
 6   {
 7     RuleFor(customer => customer.Surname).NotEmpty();
 8     RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
 9     RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
10     RuleFor(customer => customer.Address).Length(20, 250);
11     RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
12   }
13 
14   private bool BeAValidPostcode(string postcode) 
15   {
16     // custom postcode validating logic goes here
17   }
18 }
19 
20 // 手動驗證規則
21 Customer customer = new Customer();
22 CustomerValidator validator = new CustomerValidator();
23 ValidationResult results = validator.Validate(customer);
24 
25 bool validationSucceeded = results.IsValid;
26 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的驗證規則庫中。

    

1 // 在Global.asax.cs中的Applicaton_Start()函數中注冊為asp.net mvc默認的驗證規則庫。
2 
3 // fluent validation
4 FluentValidationModelValidatorProvider provider = new FluentValidationModelValidatorProvider(new AttributedValidatorFactory());
5 ModelValidatorProviders.Providers.Add(provider);
6 
7 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

注意:
  1,)作為Fluent Validation驗證規則類須繼承AbstractValidator<T>;

  2,)我們也可以仿照NopCommerce的處理方法,對AttributeValidatorFactory類的Validator(Type type)函數重寫,在特殊的業務環境下支持其他驗證規則。

 

希望更多牛人們給點建議!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM