我想验证包含类型为ICollection<IEntity>
的子集合的对象
有多个类实现IEntity。我为每个类都有一个验证器。它们都继承自ValidatorAbstract。
如何在父类中为集合中的每个子对象分配一个合适的验证器?
我使用Autofac注入依赖项。我猜我需要使用这种方法:
RuleForEach(n=>n.ChildCollection).SetValidator(container.Resolve<?>)
但是,SetValidator没有每个对象类型的上下文。
答案 0 :(得分:1)
看起来我找到了我想要的答案。关键是要创建一个派生自NoopPropertyValidator的自定义验证器类,并为其提供Autofac容器(或其他IOC容器)
public class EntityCollectionValidator<TEntity> : NoopPropertyValidator
{
private readonly IComponentContext _container;
public EntityCollectionValidator(IComponentContext container)
{
_container = container;
}
public override IEnumerable<ValidationFailure> Validate(PropertyValidatorContext context)
{
var results = new List<ValidationFailure>();
var collection = context.PropertyValue as IEnumerable<TEntity>;
if (collection == null) return results;
foreach (var entity in collection)
{
var interfaceType = typeof (IValidator<>).MakeGenericType(entity.GetType());
if (!_container.IsRegistered(interfaceType)) continue;
var validator = _container.Resolve(interfaceType) as IValidator<TEntity>;
if (validator != null)
results.AddRange(validator.Validate(entity).Errors);
}
return results;
}
}
在验证类中,实例化的方法是在一般资源集合上执行此操作:
RuleFor(n => n.ChildCollection)SetValidator(new EntityCollectionValidator<IChild>(container));