Enterprise Library 3.0 体验 -- Validation Application Block (3)
前面提到过使用Validation Application Block进行数据验证的方式有两种,1. 使用Attribute 2.使用配制文件(WebConfip、AppConfig….),在前两篇里,
l Enterprise Library 3.0 体验 -- Validation Application Block (1)
l Enterprise Library 3.0 体验 -- Validation Application Block (2)
介绍的是使用Attribute进行验证的方法,今天再来演示一下如何使用Configuration File进行验证。
注意:
这里使用的Enterprise Library版本为 3.0 December 2006 CTP ,由于该版本是CTP版本,所以功能尚不完善,目前的这个版本里所带的配置工具(EL 3.0 Configuration)并不支持Validation的xml配置信息的图形化操作,因此只能手工的在配置文件中添加数据验证规则。相信在正式版本中,这个问题会得到妥善的解决。
仍然以ValidationDemo1中的Student实体类为例,省略部分相似代码,详细代码可参照示例1.
其数据有效性规则如下:
学号:非空,长度为9位。
姓名:非空,长度为1~10之间。
年龄:允许为空,但是大小要在18岁~24岁之间。
1. 新建一个控制台工程: ValidationDemo3
2. 添加引用: Microsoft.Practices.EnterpriseLibrary.Validation
3. 添加实体类Student.,此处不需要添加任何Attribute。
2 {
3 private string _stdNo;
4 public string StdNo
5 {
6 get { return _stdNo; }
7 set { _stdNo = value; }
8 }
9
10 private string _name;
11 public string Name
12 {
13 get { return _name; }
14 set { _name = value; }
15 }
16
17 private int _age;
18 public int Age
19 {
20 get { return _age; }
21 set { _age = value; }
22 }
23 }
4. 为项目添加一个配置文件app.config ,并在配置文件中添加对于Student类的验证规则:
2 <configSections>
3 <section name="validation" type="Microsoft.Practices.EnterpriseLibrary.Validation.Configuration.ValidationSettings,Microsoft.Practices.EnterpriseLibrary.Validation"/>
4 </configSections>
5 <validation>
6 <type name="Validation_Application_Block_Part3.Student" defaultRule="default">
7 <rule name="default">
8 <properties>
9 <property name="StdNo">
10 <add name="StdNoNotNull" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.NotNullValidator,Microsoft.Practices.EnterpriseLibrary.Validation" />
11 <add name="StdNoLength" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.StringLengthValidator,Microsoft.Practices.EnterpriseLibrary.Validation" lowerBound="9" upperBound="9" lowerBoundType="Inclusive" upperBoundType="Inclusive"/>
12 </property>
13 <property name="Name">
14 <add name="NameNotNull" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.NotNullValidator,Microsoft.Practices.EnterpriseLibrary.Validation" />
15 </property>
16 <property name="Age">
17 </property>
18 </properties>
19 </rule>
20 </type>
21 </validation>
22 </configuration>
5. 编写测试程序并添加命名空间: Microsoft.Practices.EnterpriseLibrary.Validation
6. 运行程序,察看输出结果。
关于配置信息的几点说明:
l 通过type name属性来指定需要验证的实体类的名称,这里的value应当是命名空间+类名,即namespace.calssname.
l 配置文件中仍然支持规则集(RuleSet)的定义,并且可以通过defaultRule 属性来指定一个规则集作为默认的验证规则。
l 对于数据范围的验证,如StringLengthValidator,需要通过属性(lowerBound、upperBound)来指定它的上下边界。
l 如果仅仅使用配置文件来定义数据规则而不使用Attrubute,推荐使用Validation.ValidateFromConfiguation()方法来替代Validation.Validate()方法,这样可以避免实例化IAttributeSource接口,在一定程度上提高了运行效率。
总结:
本文介绍了使用Validation Application Block的另一种方法,既通过配置文件来定义数据规则,它同样支持规则集(RuleSet)等功能,此外在配置文件中定义数据规则具有更高的灵活性,不需要重新编译程序就可以达到动态改变数据规则的要求。缺点是目前EL 3.0 CTP版本尚不支持 Validation Configuration 与 Configuration Tool的集成,需要手工填写配置信息,相对有些繁琐。
此外细心的朋友可能发现,配置文件中并没有对Age属性的验证定义,是因为我在写这个例子的过程中,并没有找到Int32RangeValidator的边界的定义方法,由于Int32RangeValidator要求是整数型,所以如果按照StringLengthValidator的方法来定义上下界则会报错,望高手指点。