gpt4 book ai didi

list - 如何将对象列表注入(inject)温莎城堡的构造函数中

转载 作者:行者123 更新时间:2023-12-04 04:44:20 26 4
gpt4 key购买 nike

如何将其转换为 CaSTLe Windsor 中的构造函数注入(inject)(它似乎与这个问题有关 Windsor Castle resolving multiple dependencies with same interface 但我认为我的示例有点复杂?)。

public class ImageUpdaters : List<IImageUpdater>
{
public ImageUpdaters()
{
Add(new ApplicationTileBackImageUpdater(ApplicationUnits.Imperial));
Add(new ApplicationTileBackImageUpdater(ApplicationUnits.Metric));
Add(new ApplicationTileFrontImageUpdater(ApplicationUnits.Imperial));
Add(new ApplicationTileFrontImageUpdater(ApplicationUnits.Metric));
...
}
}

它不像只传递 IImageUpdater 的所有实现的列表那么简单,因为大多数都是参数化的。
我有另一个稍微复杂一点的例子,其中一些对象需要共享同一个实例
    public DataProcessors()
{
var snowReportRetriever = new CachingDataRetriever(new UriRetriever("http://.."));
var notificationSender = new NotificationSender(new MessageGenerator(new SQLDataReader()), new MessageSender());
var snowDepthProcessor = new DataProcessor<SnowDepthModel>(
"SnowDepthFact"
, snowReportRetriever
, new SnowDepthParser()
, new SnowDepthModelPersistor()
, new SnowDepthModelNotifier(notificationSender)
, new SQLDataReader());

var runsOfTheDayProcessor = new DataProcessor<ModelList<RunsOfTheDayModel>>
(
"RunsOfTheDayFact"
, snowReportRetriever
, new RunsOfTheDayParser()
, new RunsOfTheDayModelPersistor()
, new SQLDataReader());
...

编辑:我到了某个地方,我可以注册个人 ImageUpdaters 和 List 但列表是空的,所以我的断言失败了?
        container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel, true));
container.Register(
Component.For<IList<IImageUpdater>>()
.ImplementedBy<List<IImageUpdater>>()
);
container.Register(
Component.For<IImageUpdater>()
.ImplementedBy<ApplicationTileFrontImageUpdater>()
.DependsOn(Property.ForKey<ApplicationUnits>().Eq(ApplicationUnits.Metric))
.Named("ApplicationTileFrontImageUpdaterMetric")
);
...
var imageUpdaters = container.Resolve<IList<IImageUpdater>>();
Assert.AreEqual(13,imageUpdaters.Count);

最佳答案

我已经解决了,如果有人对这是否是一个好的/最佳解决方案有任何反馈,我会非常感兴趣

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

container.Register(
Component.For<IImageUpdater>()
.ImplementedBy<ApplicationTileFrontImageUpdater>()
.DependsOn(Property.ForKey<ApplicationUnits>().Eq(ApplicationUnits.Metric))
.Named("ApplicationTileFrontImageUpdaterMetric")
);
container.Register(
Component.For<IImageUpdater>()
.ImplementedBy<ApplicationTileFrontImageUpdater>()
.DependsOn(Property.ForKey<ApplicationUnits>().Eq(ApplicationUnits.Imperial))
.Named("ApplicationTileFrontImageUpdaterImperial")
);
....
container.Register(
Component.For<TestImageUpdaterClass>()
.ImplementedBy<TestImageUpdaterClass>()
);

var tiuc = container.Resolve<TestImageUpdaterClass>();
Assert.AreEqual(13, tiuc.ImageUpdaters.Count);

然后出于测试目的,使用 IImageUpdaters 列表的类
    public class TestImageUpdaterClass
{
public IList<IImageUpdater> ImageUpdaters { get; set; }

public TestImageUpdaterClass(IList<IImageUpdater> imageUpdaters)
{
ImageUpdaters = imageUpdaters;
}
}

关于list - 如何将对象列表注入(inject)温莎城堡的构造函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18420842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com