Как не указывать имя набора правил при чтении из файла конфигурации? - PullRequest
1 голос
/ 05 апреля 2010

Когда я читаю правила из файла конфигурации, я делаю что-то вроде этого:

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 ]

1 голос
/ 09 апреля 2010

При использовании атрибутов, когда набор правил не указан в валидаторе или вызове проверки, будут применяться все правила, для которых не определен набор правил или имя набора правил пустое.

Однако в конфигурации это немного отличается, поскольку (как вы упоминаете) имя набора правил требуется для конфигурации. Вам нужно создать набор правил с именем и указать, что это набор правил по умолчанию . Чтобы указать, что набор правил является набором правил по умолчанию, примените атрибут 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>
0 голосов
/ 19 июня 2010

Ответ выше привел меня туда, куда мне нужно было идти. Тем не менее, я думаю, что приведенная ниже информация также полезна.

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

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

CreateValidatorFromConfiguration <(Of <(T>)>) () () ()
Возвращает валидатор, представляющий критерии валидации, заданные для типа T, через конфигурацию для набора правил по умолчанию.

А также:

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

CreateValidator <(Of <(T>)>) () () ()
Возвращает валидатор, представляющий критерии валидации, указанные для типа T, через конфигурацию и атрибуты для типа T и его предков для набора правил по умолчанию.

Что означает в конце дня ...... знайте, что ValidationFactory!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...