Применить пользовательский валидатор по интерфейсу

Допустим, у меня есть интерфейс:

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.

Как заставить это работать?

EDIT: я нашел один способ заставить это работать, и это сделать SelfValidation, где я привожу к ISomeInterface и проверяю так. Этого будет достаточно, но вопрос остается открытым, чтобы посмотреть, есть ли другие способы сделать это.

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

person Chris Hawkins    schedule 09.01.2013    source источник


Ответы (2)


Это ограничение блока приложения проверки. Вот статья, в которой описывается, как добавить наследование Validator для VAB .

person Steven    schedule 09.01.2013

Один из подходов к проверке интерфейсов — использовать ValidationFactory для создания валидатора для интерфейса вместо использования статического фасада Validator.Validate() или CreateValidator() на основе конкретного типа. Например, это должно работать с учетом вашего подхода:

var validator = ValidationFactory.CreateValidator<ISomeInterface>();
ValidationResults validationResults = validator.Validate(someInterfaceInstance);
person Randy supports Monica    schedule 10.01.2013
comment
При этом выполняются только правила, относящиеся к переданному типу. Что, если бы у меня было несколько интерфейсов, которые я хотел бы использовать для совместной проверки? Я ищу что-то, что выполняет все правила для всех реализованных интерфейсов. - person Chris Hawkins; 10.01.2013