検証アプリケーションブロックを使用した自己検証を伴うメタデータタイプ
質問
メタデータタイプにある私の検証で自己検証属性を使用することは可能ですか? Enterprise Library 5の検証アプリケーションブロックを使用しています。
解決
私が他の答えで説明したように、これは箱から出してサポートされていません。ただし、これは、依存症の注入を使用してフレームワークに接続し、既存のものを交換することで実現できます。 AttributeValidatorFactory
実装。私はこれを行う方法について私のウェブログに投稿を書きました: 検証アプリケーションブロックとData Annotationの混合:自己検証はどうですか?
これが役立つことを願っています。
他のヒント
これは現在、VABによって(箱から出して)サポートされていません。例を探してください このスレッド Entlibフォーラムで。これがサポートされていない主な理由は、メタデータ型に[自己検証]メソッドを単に配置して、これが機能することを期待できないからだと思います。それが機能しない理由は、自己検証方法が通常、タイプのインスタンスメンバーを検証するためです。自己検証方法の署名には、検証する実際のオブジェクトは含まれていません。
周りの簡単な作業は、エンティティからメタデータ型を呼び出すことです。例えば:
[MetadataType(typeof(InvoiceMetaData))]
[HasSelfValidation]
public partial class Invoice
{
public string Name{ get; set; }
public int Price { get; set; }
[SelfValidation]
public void CustomValidate(ValidationResults results)
{
// Call into the meta data class
InvoiceMetaData.Validate(this, results);
}
}
public class InvoiceMetaData
{
[StringLengthValidator(1, 10, Tag = "Name")]
string Name { get; set; }
[RangeValidator(0, RangeBoundaryType.Inclusive, 0,
RangeBoundaryType.Ignore, Tag = "Price")]
int Price { get; set; }
public static void CustomValidate(Invoice instance,
ValidationResults results)
{
results.AddResult(new ValidationResult("ErrorMessage1",
instance, "", "", null));
}
}
もちろん、これは非常にきれいな解決策ではありません。しかし、VABは非常に拡張可能であり、バージョン5.0は良くなりました。必要に応じて、既存の交換を行うことができます AttributeValidationFactory
そして、これを行うことができるバージョンに置き換えます。でも簡単ではありません。
乾杯
所属していません StackOverflow