【问题标题】:How to not specify ruleset name when reading from config file?从配置文件读取时如何不指定规则集名称?
【发布时间】:2025-11-25 19:20:04
【问题描述】:

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

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 需要规则集的名称属性

【问题讨论】:

    标签: .net validation enterprise-library


    【解决方案1】:

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

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

    如果创建了一个没有指定规则集的验证器,那么在调用 Validate 时将执行配置中的默认规则集。

    在您的示例中,配置如下所示:

    <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>
    

    【讨论】:

      【解决方案2】:

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

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

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

      CreateValidatorFromConfiguration)>)()()()
      返回一个验证器,表示通过默认规则集的配置为类型 T 指定的验证标准。

      还有:

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

      CreateValidator)>)()()()
      返回一个验证器,该验证器表示通过配置和类型 T 上的属性以及默认规则集的祖先为类型 T 指定的验证标准。

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

      【讨论】: