自定义验证类,扩展企业库验证程序块
当验证程序块中的验证器不能满足我们的验证要求时,就需要扩展验证程序块,创建自定义的验证器类。
创建自定义的验证器类一般需要完成三个类,如下:
1. xxxValidator
2. xxxValidatorData
3. xxxValidatorAttribute
说明:
1. xxxValidator
验证器类,包含你自己的验证逻辑,以及错误提示信息。
这个类必须继承自已有的验证器类或者Validator, Validator<T>, ValueValidator, ValueValidator<T>当中的一个。
Validator与ValueValidator的差别就在于是验证类是否有Negated属性,即反面验证属性。
2. xxxValidaotrData
用于从配置文件中读取配置数据,构建验证类对象。当你从配置文 件中创建验证器时就需要此类。
这个类必须继承自已有的配置类或者ValidatorData, ValueValidatorData当中的一个。
ValidatorData与ValueValidatorData的差别就在于是配置数据中是否有Negated属性,即反面验证属性。
3. xxxValiatorAttribute
用于从特性(attribute)中读取配置数据,构建验证类对象。当你从类
的特性中创建验证器是就需要此类。
这个类必须继承自已有的配置类或者ValiatorAttribute,
ValueValiatorAttribute当中的一个。
ValiatorAttribute与ValueValiatorAttribute的差别就在于是配置数据 中是否有Negated属性,即反面验证属性。
示例:
我们要创建一个多值验证类,对给定值进行验证,判断其值是否是给定的多值的组合。
来看看我们需要什么配置数据:既然是多值验证,那当然需要提供多值列表。多值组合在一起,那就需要一个分隔符。所以此多值验证类只需要两个配置数据:多值列表和分隔符。可能你会想,少了一个配置数据吧,要验证的属性或者字段。这个配置数据就不用我们操心了,企业验证库已经担当了这个责任。
先创建多值验证类MutilValueValidaotr,她需要什么数据呢,显然,她需要一个多值集合和一个分隔符。再看看我这个验证类是继承自Validator还是ValueValidator呢,两者的区别只在于是否有“否验证”的功能,这里我们让她继承自Validator<string>,因为我们不需要“否验证”的特点,而且要验证的值为string类型。继承自Validator<string>要实现
void DoValidate(string objectToValidate, object currentTarget, string key, ValidationResults validationResults)方法和string DefaultMessageTemplate属性,前者是编写你自己的验证逻辑,后者是默认的错误信息。先看看DoValidate的参数,objectToValidate是要验证的值,currentTarget是要验证的值所属的对象,key是要验证的值得属性名或者字段名,validationResults是验证结果集,我们验证的结果要加入到结果集中。
给MutilValueValidaotr增加三个构造函数,其中一个构造函数的参数是MutilValueData,即我们将要创建的配置文件类。
代码见MutilValueValidator.cs
接下来创建配置文件类MutilValueValidaotrData,我们已经知道配置文件要提供两个配置数据:多值列表和分隔符。
我们增加两个属性MutilValue和Seperator,属性值的来源于配置文件,给这两个类增加ConfigurationProperty特性,这样告之它们的值来源于配置文件。
MutilValueValidaotrData我们需要实现Validator DoCreateValidator(Type targetType) 方法,用于创建一个验证器类MutilValueValidaotr对象。
代码见MutilValueValidatorData.cs
最后创建特性配置类MutilValueValidaotrAttribute。此类也要实现protected override Validator DoCreateValidator(Type targetType),用于创建MutilValueValidaotr对象。显然她和MutilValueValidaotrData一样,需要同样的配置数据MutilValue和Seperator,为此我们创建这样的两个字段,从构造函数里初始化这两个数据。
代码见MutilValueValidatorAttribute.cs
到此所需要的三个类已经完成,现在编写测试代码,使用Nuit来测试,Nunit安装程序为NUnit-