C# 使用Castle Windsor将具有不同实现列表的对象解析为构造函数参数

C# 使用Castle Windsor将具有不同实现列表的对象解析为构造函数参数,c#,dependency-injection,castle-windsor,C#,Dependency Injection,Castle Windsor,我有以下构造函数: public DataImporterService(IList<IDataValidator> dataValidators, IList<IDataComparer> dataComparers, IList<IDataStorage> dataStorages) { _dataValidators = dataValidators; _dataComparers

我有以下构造函数:

public DataImporterService(IList<IDataValidator> dataValidators,     IList<IDataComparer> dataComparers, IList<IDataStorage> dataStorages)
        {
            _dataValidators = dataValidators;
            _dataComparers = dataComparers;
            _dataStorages = dataStorages;
        }
公共数据导入服务(IList数据验证程序、IList数据比较程序、IList数据存储) { _dataValidators=dataValidators; _数据比较器=数据比较器; _数据存储=数据存储; } 这是我的注册:

Component.For<IDataComparer>().ImplementedBy<PlanOfRecordComparer>().Named("planOfRecordComparer"),
                Component.For<IDataComparer>().ImplementedBy<PlanOfExecutionComparer>().Named("planOfExecutionComparer"),
                 Component.For<IDataComparer>().ImplementedBy<BomComparer>().Named("bomComparer"),
                Component.For<IDataStorage>().ImplementedBy<PlanOfRecordStorage>().Named("planOfRecordStorage"),
                Component.For<IDataStorage>().ImplementedBy<PlanOfExecutionStorage>().Named("planOfExecutionStorage"),
                Component.For<IDataValidator>().ImplementedBy<PlanOfExecutionValidator>().Named("planOfExecutionValidator"),
                Component.For<IDataValidator>().ImplementedBy<PlanOfRecordValidator>().Named("planOfRecordValidator"),
                Component.For<IDataValidator>().ImplementedBy<BomValidator>().Named("bomValidator")
Component.For().ImplementedBy().Named(“planOfRecordComparer”),
Component.For().ImplementedBy().Named(“planOfExecutionComparer”),
Component.For().ImplementedBy().Named(“bomComparer”),
Component.For().ImplementedBy().Named(“planOfRecordStorage”),
Component.For().ImplementedBy().Named(“planOfExecutionStorage”),
Component.For().ImplementedBy().Named(“planOfExecutionValidator”),
Component.For().ImplementedBy().Named(“planOfRecordValidator”),
Component.For().ImplementedBy().Named(“bomValidator”)

但是,是否可以以另一种方式注册组件,而不需要指定IDataComparer、IDataValidator和IDataStorage的每个实现?类似于更通用的方式?

您是否正在寻找自动注册(又称基于约定的配置)

如果是这样,根据的第10.1.2节中的示例,您应该能够执行以下操作

container.Register(AllTypes
    .FromAssemblyContaining<PlanOfExecutionComparer>()
    .BasedOn<IDataComparer>());
container.Register(所有类型
.FromAssemblyContaining()
.BasedOn());

好的,我就是这样做的:

首先,我使用了collectionresolver:

 container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));
要注册实现
IDataComparer
IDataStorage
IDataValidator

Classes.FromThisAssembly().Where(x => x.Name.EndsWith("Validator")).WithServiceFirstInterface(),
Classes.FromThisAssembly().Where(x => x.Name.EndsWith("Comparer")).WithServiceFirstInterface(),
Classes.FromThisAssembly().Where(x=>x.Name.EndsWith("Storage")).WithServiceFirstInterface()
然后我就可以解决我的问题了:

public DataImporterService(IDataValidator[] dataValidators, IDataComparer[] dataComparers, IDataStorage[] dataStorages)
        { }
因此,当Castle Windsor尝试解析DataImporterService时,它会获取实现注入接口的所有类,构造一个数组,将它们放入数组中,并提供数组作为依赖项的值


这是文档中提供的

只是写了相同的答案,但我将包括。太好了!但是现在我在解决
DataImporterService(IList dataValidators、IList dataComparers、IList DataStorage)时遇到了一个问题
它抛出一个:
组件Api.Services.DataImporterService依赖于System.Collections.Generic.IList
1[Api.Contracts.IDataValidator],我已经注册了一个collectionresolver。。。