使用 Castle Windsor 解析具有不同实现列表作为构造函数参数的对象
Resolving object with List of different implementations as constructor parameter using Castle Windsor
我有以下构造函数:
public DataImporterService(IList<IDataValidator> dataValidators, IList<IDataComparer> dataComparers, IList<IDataStorage> dataStorages)
{
_dataValidators = dataValidators;
_dataComparers = dataComparers;
_dataStorages = dataStorages;
}
这是我的注册:
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")
但是是否可以用另一种方式注册组件而不需要指定 IDataComparer、IDataValidator 和 IDataStorage 的每个实现?比如更通用的方式?
您是否在寻找自动注册(又名基于约定的配置)?
如果是这样,根据 my book 第 10.1.2 节中的示例,您应该能够执行类似
的操作
container.Register(AllTypes
.FromAssemblyContaining<PlanOfExecutionComparer>()
.BasedOn<IDataComparer>());
好的,这就是我的工作方式:
首先我使用了一个集合解析器:
container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));
注册所有实现 IDataComparer
, IDataStorage
, IDataValidator
的 classes
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()
然后我就能够解决我的 class:
public DataImporterService(IDataValidator[] dataValidators, IDataComparer[] dataComparers, IDataStorage[] dataStorages)
{ }
因此,当 Castle Windsor 尝试解析 DataImporterService 时,它会获取所有实现注入接口的 classes,构造一个数组,将它们放入数组中,并提供数组作为依赖项的值。
这在文档中提供 here
我有以下构造函数:
public DataImporterService(IList<IDataValidator> dataValidators, IList<IDataComparer> dataComparers, IList<IDataStorage> dataStorages)
{
_dataValidators = dataValidators;
_dataComparers = dataComparers;
_dataStorages = dataStorages;
}
这是我的注册:
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")
但是是否可以用另一种方式注册组件而不需要指定 IDataComparer、IDataValidator 和 IDataStorage 的每个实现?比如更通用的方式?
您是否在寻找自动注册(又名基于约定的配置)?
如果是这样,根据 my book 第 10.1.2 节中的示例,您应该能够执行类似
的操作container.Register(AllTypes
.FromAssemblyContaining<PlanOfExecutionComparer>()
.BasedOn<IDataComparer>());
好的,这就是我的工作方式:
首先我使用了一个集合解析器:
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()
然后我就能够解决我的 class:
public DataImporterService(IDataValidator[] dataValidators, IDataComparer[] dataComparers, IDataStorage[] dataStorages)
{ }
因此,当 Castle Windsor 尝试解析 DataImporterService 时,它会获取所有实现注入接口的 classes,构造一个数组,将它们放入数组中,并提供数组作为依赖项的值。
这在文档中提供 here