3

メタデータ型にある検証で selfvalidation 属性を使用することはできますか? Enterprise Library 5 の Validation Application Block を使用しています。

4

2 に答える 2

2

他の回答で説明したように、これはそのままではサポートされていません。ただし、これは、依存性注入を使用してフレームワークにフックし、既存のAttributeValidatorFactory実装を置き換えることで実現できます。これを行う方法については、ブログに投稿しました: Mixing Validation Application Block With DataAnnotation: What About SelfValidation?

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

于 2010-09-12T17:59:03.790 に答える
1

これは現在、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ものを交換して、これを実行できるバージョンに置き換えることができます。しかし、それは簡単ではありません。

乾杯

于 2010-09-11T14:47:41.493 に答える