我创建这个是为了让处理这个场景更简单:
public class DerivedValidatorBase<TBase> : AbstractValidator<TBase>
{
public void MapDerivedValidator<TType, TValidatorType>()
where TValidatorType : IEnumerable<IValidationRule>, IValidator<TType>, new()
where TType: TBase
{
When(t => t.GetType() == typeof(TType), () => AddDerivedRules<TValidatorType>());
}
public void MapDerivedValidator<TType, TValidatorType>(TValidatorType validator)
where TValidatorType : IEnumerable<IValidationRule>, IValidator<TType>
where TType: TBase
{
When(t => t.GetType() == typeof(TType), () => AddDerivedRules<TValidatorType>(validator));
}
private void AddDerivedRules<T>(T validator)
where T : IEnumerable<IValidationRule>
{
foreach (var rule in validator)
{
this.AddRule(rule);
}
}
private void AddDerivedRules<T>()
where T : IEnumerable<IValidationRule>, new()
{
IEnumerable<IValidationRule> validator = new T();
foreach (var rule in validator)
{
this.AddRule(rule);
}
}
}
然后我简单地创建一个基本的验证器类:
public class CommonBaseClassValidator : DerivedValidatorBase<BaseClass>
{
public CommonBaseClassValidator()
{
MapDerivedValidator<DerivedClass, DerivedClassValidator>();
}
}
或者当使用依赖注入时:
public class CommonBaseClassValidator : DerivedValidatorBase<BaseClass>
{
public CommonBaseClassValidator(DerivedClassValidator validator)
{
MapDerivedValidator<DerivedClass, DerivedClassValidator>(validator);
}
}
使用中:
RuleFor(v => v.BaseClasses).SetCollectionValidator(new CommonBaseClassValidator());
这样我可以为派生类重复使用现有的验证器,我可能在别处使用这些验证器,并轻松映射它们。