2

私がインターフェースを持っているとしましょう:

public interface ISomeInterface
{
    bool SomeBool { get; set; }

    string ValueIfSomeBool { get; set; }
}

そして、それを実装するクラスがいくつかあります。すなわち

public class ClassA : ISomeInterface
{
    #region Implementation of ISomeInterface

    public bool SomeBool { get; set; }

    public string ValueIfSomeBool { get; set; }

    #endregion

    [NotNullValidator]
    public string SomeOtherClassASpecificProp { get; set; }
}

そして、次のようなカスタムバリデーターにこのインターフェイスのプロパティの検証ロジックがあります。

public class SomeInterfaceValidator : Validator<ISomeInterface>
{
    public SomeInterfaceValidator (string tag)
        : base(string.Empty, tag)
    {
    }

    protected override string DefaultMessageTemplate
    {
        get { throw new NotImplementedException(); }
    }

    protected override void DoValidate(ISomeInterface objectToValidate, object currentTarget, string key, ValidationResults validationResults)
    {
        if (objectToValidate.SomeBool && 
            string.IsNullOrEmpty(objectToValidate.ValIfSomeBool))
        {
            validationResults.AddResult(new ValidationResult("ValIfSomeBool cannot be null or empty when SomeBool is TRUE", currentTarget, key, string.Empty, null));
        }

        if (!objectToValidate.SomeBool && 
            !string.IsNullOrEmpty(objectToValidate.ValIfSomeBool))
        {
            validationResults.AddResult(new ValidationResult("ValIfSomeBool must be null when SomeBool is FALSE", currentTarget, key, string.Empty, null));
        }
    }
}

そして、ISomeInterfaceを装飾するこのバリデーターを適用するための属性があります。

[AttributeUsage(AttributeTargets.Interface)]
internal class SomeInterfaceValidatorAttribute : ValidatorAttribute
{
    protected override Validator DoCreateValidator(Type targetType)
    {
        return new SomeInterfaceValidator(this.Tag);
    }
}

Validation.Validateを呼び出すと、SomeInterfaceValidatorで検証が実行されていないようです。ClassAに固有の検証を行いますが、インターフェイスISomeInterfaceの検証は行いません。

これを機能させるにはどうすればよいですか?

編集: これを機能させる1つの方法を見つけました。それは、SelfValidationを実行することです。ここで、ISomeInterfaceにキャストし、そのように検証します。これで十分ですが、これを達成する他の方法があるかどうかを確認するために、質問を開いたままにしておきます。

    [SelfValidation]
    public void DoValidate(ValidationResults results)
    {
        results.AddAllResults(Validation.Validate((ISomeInterface)this));
    }
4

2 に答える 2

0

インターフェースを検証する 1 つの方法は、静的ファサードを使用したり具象型に基づいたりValidationFactoryする代わりに、 を使用してインターフェースの Validator を作成することです。たとえば、これはあなたのアプローチを考えるとうまくいくはずです:Validator.Validate()CreateValidator()

var validator = ValidationFactory.CreateValidator<ISomeInterface>();
ValidationResults validationResults = validator.Validate(someInterfaceInstance);
于 2013-01-10T00:11:52.020 に答える
0

これは、検証アプリケーション ブロックの制限です。VAB の Validator 継承を追加する方法を説明する記事を次に示します。

于 2013-01-09T15:17:46.987 に答える