【问题标题】:How do you Inject a list of objects into a constructor in Castle Windsor如何将对象列表注入温莎城堡的构造函数中
【发布时间】:2013-08-27 13:38:22
【问题描述】:

如何将其转换为 Castle Windsor 中的构造函数注入(似乎与这个问题有关 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 和列表,但列表是空的,所以我的断言失败了?

        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);

【问题讨论】:

    标签: list dependency-injection castle-windsor


    【解决方案1】:

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

            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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多