在实际的应用中,数据的有效性通常是来自业务方面的,然而对于纷繁的业务规则来讲,仅仅一套数据的有效性规则是难以应付的,而且业务需求的不断变更也会反过来影响数据有效性规则的制定。那么如何来应对这种情况呢? EL3.0的开发人员已经充分的考虑到了这种情况,并允许通过使用规则集(RuleSet)来制定多套数据的验证规则,这样开发者可以在验证数据时动态的指定想要使用的验证规则。
还是以第一篇中讲的Student实体类为例(http://www.cnblogs.com/shenfx318/archive/2007/01/07/613705.html),现在,由于学生编制改革,产生了新的数据规则,新规则要求不同年级的学生通过学号区分开来。具体的业务规则如下:
一年级的学生
学号:非空、长度9位
姓名:非空
年龄:18~20
二年级的学生
学号:非空、长度12位
姓名:非空
年龄:20~22
可以看到,对于2年级的学生,学号的长度由原来的9位增长到了12位,年龄段也和1年级的学生区分开来。这里刚好可以使用我们的规则集(RuleSet)针对不同年级的不同需求来制定数据规则。
2 {
3 private string _stdNo;
4
5 [NotNullValidator]
6 [StringLengthValidator( 9 , 9 ,Ruleset = " Grade1 " )]
7 [StringLengthValidator( 12 , 12 , Ruleset = " Grade2 " )]
8 public string StdNo
9 {
10 get { return _stdNo; }
11 set { _stdNo = value; }
12 }
13 private string _name;
14
15 [NotNullValidator]
16 [StringLengthValidator( 1 , 10 )]
17 public string Name
18 {
19 get { return _name; }
20 set { _name = value; }
21 }
22 private int _age;
23
24 [Int32RangeValidator( 18 , 20 ,Ruleset = " Grade1 " )]
25 [Int32RangeValidator( 20 , 22 ,Ruleset = " Grade2 " )]
26 public int Age
27 {
28 get { return _age; }
29 set { _age = value; }
30 }
31 }
再来编写一个函数,通过验证学生的数据是否符合相应的数据规则来区分这个学生是属于哪个年级的。
2 {
3 // Valid this student with rule "Grade1".
4 IValidator grade1Validator = ValidationFactory.CreateValidator < Student > ( " Grade1 " );
5 ValidationResults results = grade1Validator.Validate(s);
6
7 if ( ! results.IsValid)
8 {
9 Console.WriteLine(s.Name + " is not in grade1 course: " );
10 foreach (ValidationResult result in results)
11 {
12 string errorMsg = " Key: {0}, Message: {1} " ;
13 Console.WriteLine( string .Format(errorMsg, result.Key.ToString(), result.Message.ToString()));
14 }
15
16 Console.ReadLine();
17 }
18
19 // Valid this student with rule "Grade2".
20 IValidator grade2Validator = ValidationFactory.CreateValidator < Student > ( " Grade2 " );
21 results = grade2Validator.Validate(s);
22
23 if ( ! results.IsValid)
24 {
25 Console.WriteLine(s.Name + " is not in grade2 course: " );
26 foreach (ValidationResult result in results)
27 {
28 string errorMsg = " Key: {0}, Message: {1} " ;
29 Console.WriteLine( string .Format(errorMsg, result.Key.ToString(), result.Message.ToString()));
30 }
31
32 Console.ReadLine();
33 }
34 }
生成两个学生的实例进行测试
2 {
3 // Jack is a grade1 student.
4 Student grade1Student = new Student();
5 grade1Student.StdNo = " 123456789 " ;
6 grade1Student.Name = " Jack " ;
7 grade1Student.Age = 19 ;
8
9 ValidStudent(grade1Student);
10
11 // Tom is a grade2 student.
12 Student grade2Student = new Student();
13 grade2Student.StdNo = " 123456789012 " ;
14 grade2Student.Name = " Tom " ;
15 grade2Student.Age = 21 ;
16
17 ValidStudent(grade2Student);
18 }
运行察看输出结果:
Jack is not in grade2 course………..
Tom is not in gread1 course……….
补充说明:
可以看到这里我用于验证数据的代码有别于示例1中的代码,是通过调用ValidationFactory的Create方法实例化一个IValidator,这其实和EL其他的Block一样采用了工厂模式,通过源代码可以看出实际上Validation的Validate方法也是调用的ValidationFactory,这里我只不过是直接使用了ValidationFactory,算是另一种验证方式的演示。