在Windsor中基于某些标志注入不同组件的正确方法

时间:2017-08-18 08:12:57

标签: c# dependency-injection castle-windsor

我正在使用遗留应用程序。在我的长矛时间里,我想用组件初始化进行清理,并将大部分内容移到Windsor(这是我们选择的DI框架)。

不幸的是,在过去,有人决定通过XML配置文件使用Windsor,这真的很复杂......

好的,直接问题。我想根据一些标志或根组件实现注入一组不同的实现,例如,让我说我有FlowA和FlowB,我想要注入这个层次结构:

FlowA:

  • SomeFactoryA:IFactoryComponenet
  • SomeService1A:IService1
  • SomeService2:IService2
  • SomeService3:IService3

FlowB:

  • SomeFactoryB:IFactoryComponenet
  • SomeService1B:IService1
  • SomeService2:IService2
  • SomeService3:IService3

基本上,有些组件只有一个实现,有些则有所不同。我总是有一些服务实现,一些用于遗留模式,一些用于新流程,一些用于流程的其他特殊变体。

我想到的唯一一件事就是将所有这些工作人员都包装在工厂中,但后来我觉得这只是以某种方式删除DI框架而且我失去了单个组件更改的灵活性。

有没有办法指示Windsor识别某些参数并注入不同的实现?或者我在这里滥用DI。如果是后者,任何建议如何正确处理这种要求分开和旧学校转换(最终隐藏在工厂后面)

谢谢, 麦克

1 个答案:

答案 0 :(得分:0)

您可以查看此Named Dependencies

您可以尝试类似

的内容

FlowA和FlowB实现IWorkflow

container.Register(Component.For<IWorkflow>().ImplementedBy<FlowA>()
    .DependsOn(ServiceOverride.ForKey<IService1>().Eq("SomeService1A")));

container.Register(Component.For<IService1>().ImplementedBy<SomeService1A>()
    .Named("SomeService1A"));

通过此操作,您可以为FlowA强制实施特定的依赖SomeService1A。 对所有特定于工作流的依赖项(例如,IFactoryComponenet)执行相同操作