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

本文关键字:对象 参数 构造函数 列表 实现 Windsor Castle 使用 | 更新日期: 2023-09-27 18:26:03

我有以下构造函数:

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的每个实现?以一种更通用的方式?

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

您正在寻找自动注册(又名基于约定的配置)吗?

如果是这样的话,根据我书10.1.2节中的例子,你应该能够做一些类似的事情

container.Register(AllTypes
    .FromAssemblyContaining<PlanOfExecutionComparer>()
    .BasedOn<IDataComparer>());

好吧,这就是我让它工作的方式:

首先,我使用了一个集合解析器:

 container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));

注册实现IDataComparerIDataStorageIDataValidator 的所有类

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时,它会获取所有实现注入接口的类,构造一个数组,将它们放入数组中,并将数组作为依赖项的值。

这在这里的文档中提供