假设我有一个界面:
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接口的验证。
如何让它发挥作用?
修改 我找到了一种方法来实现这一点,那就是进行SelfValidation,我将其转换为ISomeInterface并进行验证。这样就足够了,但仍然可以留下问题,看看是否有其他方法可以实现这一目标。
[SelfValidation]
public void DoValidate(ValidationResults results)
{
results.AddAllResults(Validation.Validate((ISomeInterface)this));
}
答案 0 :(得分:0)
这是验证应用程序块的限制。这是一个article that describes how to add Validator inheritance for VAB。
答案 1 :(得分:0)
验证接口的一种方法是使用ValidationFactory
为接口创建Validator,而不是使用基于具体类型的Validator.Validate()
静态外观或CreateValidator()
。例如,这应该适用于您的方法:
var validator = ValidationFactory.CreateValidator<ISomeInterface>();
ValidationResults validationResults = validator.Validate(someInterfaceInstance);