从配置文件中读取时如何不指定规则集名称?

时间:2010-04-05 18:41:58

标签: .net validation enterprise-library

当我从配置文件中读取规则时,我会这样做:

IConfigurationSource configurationSource = new FileConfigurationSource("myvalidation.config");
var validator = ValidationFactory.CreateValidator<Salary>(configurationSource);

配置文件如下所示:

<ruleset name="Default">
  <properties>
    <property name="Address">
       <validator lowerBound="10" lowerBoundType="Inclusive" upperBound="15"
            upperBoundType="Inclusive" negated="false" messageTemplate=""
            messageTemplateResourceName="" messageTemplateResourceType=""
            tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.StringLengthValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral, PublicKeyToken=null"
name="String Length Validator" />
     </property>
  </properties>
</ruleset>

我的问题是 - 有没有办法 指定规则集名称?如果我使用属性方法并且可以使用以下方式验证,则不需要指定规则集名称:

ValidationResults results = Validation.Validate(salary);

现在从配置文件中读取时,我必须指定规则集名称。没有指定规则集名称的CreateValidator方法没有重载接受配置源。此外,配置文件中的xml需要规则集的名称属性

2 个答案:

答案 0 :(得分:1)

使用属性时,如果未在验证程序或验证调用中指定规则集,则将应用未定义规则集或规则集名称为空的所有规则。

然而,对于配置,它略有不同,因为(如您所述)配置需要规则集的名称。您需要做的是创建一个名为的规则集,然后指明它是默认的规则集。要指示规则集是默认规则集,请将属性defaultRuleset="MyRule"应用于配置中的type元素。

如果在未指定Ruleset的情况下创建验证器,则在调用Validate时将执行配置中的默认Ruleset。

在您的示例中,配置看起来像:

<type defaultRuleset="Default" [...] >
  <ruleset name="Default">
    <properties>
      <property name="Address">
         <validator lowerBound="10" lowerBoundType="Inclusive" upperBound="15"
            upperBoundType="Inclusive" negated="false" messageTemplate=""
            messageTemplateResourceName="" messageTemplateResourceType=""
            tag=""   type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.StringLengthValidator,   Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral,   PublicKeyToken=null"
            name="String Length Validator" />
       </property>
    </properties>
  </ruleset>
</type>

答案 1 :(得分:0)

上面的答案让我到了我需要去的地方。 但是,我认为以下信息也很有帮助。

    Validator<MyConcreteClass> validator= ValidationFactory.CreateValidatorFromConfiguration<MyConcreteClass>();
    ValidationResults vResults = validator.Validate(myInstanceOfMyConcreteClass);

自: http://msdn.microsoft.com/en-us/library/ee760419.aspx

CreateValidatorFromConfiguration&lt;(Of&lt;(T&gt;)&gt;)()()()
返回一个验证程序,表示通过默认规则集的配置为类型T指定的验证条件。

还有:

http://msdn.microsoft.com/en-us/library/microsoft.practices.enterpriselibrary.validation.validationfactory.createvalidator.aspx

CreateValidator&lt;(Of&lt;(T&gt;)&gt;)()()()
返回一个验证器,表示通过类型T的配置和属性为类型T指定的验证条件及其默认规则集的祖先。

这意味着在一天结束时......知道ValidationFactory!