Generics FluentValidation、Autofac和接口对象的子集合

Generics FluentValidation、Autofac和接口对象的子集合,generics,autofac,fluentvalidation,Generics,Autofac,Fluentvalidation,我想验证包含以下类型的子集合的对象:ICollection 有多个类实现了智能性。我为每个类都有一个验证器。它们都是从抽象继承来的 如何在父类中将适当的验证器分配给集合中的每个子对象 我使用Autofac注入依赖项。我猜我需要使用这种方法: RuleForEach(n=>n.ChildCollection).SetValidator(container.Resolve<?>) RuleForEach(n=>n.ChildCollection.SetValidator(cont

我想验证包含以下类型的子集合的对象:
ICollection

有多个类实现了智能性。我为每个类都有一个验证器。它们都是从抽象继承来的

如何在父类中将适当的验证器分配给集合中的每个子对象

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

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

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

看起来我已经找到了我想要的答案。关键是创建一个从NoopPropertyValidator派生的自定义验证器类,并为其提供Autofac容器(或其他IOC容器)

公共类EntityCollectionValidator:NoopPropertyValidator
{
专用只读IComponentContext容器;
公共EntityCollectionValidator(IComponentContext容器)
{
_容器=容器;
}
公共重写IEnumerable验证(PropertyValidatorContext上下文)
{
var results=新列表();
var collection=context.PropertyValue作为IEnumerable;
if(collection==null)返回结果;
foreach(集合中的var实体)
{
var interfaceType=typeof(IValidator).MakeGenericType(entity.GetType());
如果(!\u container.IsRegistered(interfaceType))继续;
var validator=_container.Resolve(interfaceType)作为IValidator;
if(验证器!=null)
results.AddRange(validator.Validate(entity).Errors);
}
返回结果;
}
}
在validating类中,实例化的方法是在通用资源集合上执行此操作:

    RuleFor(n => n.ChildCollection)SetValidator(new EntityCollectionValidator<IChild>(container));
RuleFor(n=>n.ChildCollection)SetValidator(新的EntityCollectionValidator(容器));

您需要哪些信息来解析所需的服务?Autofac包含某些CustomValidator和IValidator之间的绑定,其中ChildEntity:Entity。如果需要,我可以将Autofac的容器注入父验证程序类。
    RuleFor(n => n.ChildCollection)SetValidator(new EntityCollectionValidator<IChild>(container));