按接口应用自定义验证器

本文关键字:验证 自定义 应用 接口 | 更新日期: 2023-09-27 17:51:03

假设我有一个接口:

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时。它似乎没有在SomeInterfaceValidator中触发验证。它执行特定于ClassA的验证,而不是接口ISomeInterface的验证。

我怎么让它工作?

编辑:

我找到了一种让这个工作的方法,那就是做SelfValidation,我转换到ISomeInterface并像这样验证。这就足够了,但仍然要留下一个问题,看看是否有其他方法来实现这一目标。

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

按接口应用自定义验证器

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

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

var validator = ValidationFactory.CreateValidator<ISomeInterface>();
ValidationResults validationResults = validator.Validate(someInterfaceInstance);