メタデータ型にある検証で selfvalidation 属性を使用することはできますか? Enterprise Library 5 の Validation Application Block を使用しています。
2 に答える
他の回答で説明したように、これはそのままではサポートされていません。ただし、これは、依存性注入を使用してフレームワークにフックし、既存のAttributeValidatorFactory
実装を置き換えることで実現できます。これを行う方法については、ブログに投稿しました: Mixing Validation Application Block With DataAnnotation: What About SelfValidation?
これが役立つことを願っています。
これは現在、VABでは(そのままでは)サポートされていません。たとえば、EntLibフォーラムのこのスレッドを見てください。これがサポートされていない主な理由は、[SelfValidation]メソッドをメタデータ型に単純に配置して、これが機能することを期待できないためだと思います。それが機能しない理由は、自己検証メソッドが通常、そのタイプのインスタンスメンバーを検証するためです。自己検証メソッドの署名には、検証する実際のオブジェクトが含まれていません。
簡単な回避策は、エンティティからメタデータ型を呼び出すことです。例えば:
[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
ものを交換して、これを実行できるバージョンに置き換えることができます。しかし、それは簡単ではありません。
乾杯