2

假设我有一个界面:

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

    string ValueIfSomeBool { get; set; }
}

我有许多实现它的类。IE

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 接口的验证。

我怎样才能让它工作?

编辑: 我找到了一种让它工作的方法,那就是进行 SelfValidation,我将其转换为 ISomeInterface 并像这样进行验证。这就足够了,但仍然让问题悬而未决,看看是否有其他方法可以实现这一点。

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

2 回答 2

0

这是验证应用程序块的限制。这是一篇文章,描述了如何为 VAB 添加 Validator 继承

于 2013-01-09T15:17:46.987 回答
0

验证接口的一种方法是使用ValidationFactory为接口创建验证器,而不是使用Validator.Validate()静态外观或CreateValidator()基于具体类型。例如,考虑到您的方法,这应该可以工作:

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