2

エンタープライズ ライブラリ検証アプリケーション ブロックを使用しています。

抽象クラスA { public int fieldA; }

クラス B:A { }

タイプ B にバリデーターを追加します。フィールド fieldA を見つけることができず、構成に入力しても検証が成功しません。VAB は、抽象クラスと継承されたプロパティまたはフィールドを考慮しませんか?

4

2 に答える 2

2

VAB は、属性を使用する場合にのみ継承をサポートします。構成ベースの検証では、継承はサポートされていません (こちらの FAQ を参照してください)。entlib チームが提供する回避策は次のとおりです。

この問題を回避するには、サブクラスの検証仕様を複製します。

もちろん、この回避策は最悪です。基本クラスのすべての変更に対して、それを多くの派生型にコピーする必要がある可能性があるからです。これは脆く、エラーが発生しやすくなります。このため、基本クラスから実装に検証を複製できるソリューションを構築しました。

ここ Stackoverflow に投稿するにはコードが多すぎますが、それに関する私のブログ投稿はこちら で読むことができます。

これが役立つことを願っています。

于 2010-06-29T16:53:43.373 に答える
2

私はテストを行いましたが、これは基本クラスと抽象基本クラスでうまく機能しています。構成を投稿できますか?

フィールドを扱うときは、プロパティ検証 XML を使用しないように注意してください (逆も同様です)。

上記のサンプルに基づいて、構成は次のようになります。

  <validation>
    <type assemblyName="MyProject.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
      name="MyProject.Test.B">
      <ruleset name="RuleSetB">
        <fields>
          <field name="fieldA">
            <validator lowerBound="1" lowerBoundType="Inclusive" upperBound="100"
              upperBoundType="Inclusive" negated="false" messageTemplate="fieldA must be between 1 and 100"
              messageTemplateResourceName="" messageTemplateResourceType=""
              tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.RangeValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral, PublicKeyToken=null"
              name="Range Validator" />
          </field>
        </fields>
      </ruleset>
    </type>
  </validation>
于 2010-06-25T20:27:38.533 に答える