2013-08-24 28 views
1

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

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

回答

3

我已经工作了,如果任何人有这是否是一个好/最好的解决办法,我会出于测试目的是消耗了一类非常感兴趣

 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; 
     } 
    } 
相关问题