FluentValidation,Autofac和接口对象的子集合

时间:2014-08-14 14:20:52

标签: generics autofac fluentvalidation

我想验证包含类型为ICollection<IEntity>的子集合的对象

有多个类实现IEntity。我为每个类都有一个验证器。它们都继承自ValidatorAbstract。

如何在父类中为集合中的每个子对象分配一个合适的验证器?

我使用Autofac注入依赖项。我猜我需要使用这种方法:

RuleForEach(n=>n.ChildCollection).SetValidator(container.Resolve<?>)

但是,SetValidator没有每个对象类型的上下文。

1 个答案:

答案 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));