2

これをウィンザー城のコンストラクター注入に変換するにはどうすればよいですか (ウィンザー城が同じインターフェースで複数の依存関係を解決するこの質問に関連しているようですが、私の例はもう少し複雑だと思いますか?)。

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

1 に答える 1