基于供应商配置Windsor容器时出现问题

时间:2010-11-01 22:16:58

标签: castle-windsor

我对IoC / DI的整个概念非常熟悉,但我以前从未实现过解决方案。这是我的第一次,如果您认为有必要,请随时向我推动正确的方向。

我有多个实现相同接口的类(IMyCustomFileReader)。我需要根据应用程序中的一些 Vendor 信息使用其中一个实例。如果供应商 Vendor1 ,当我分别请求Vendor1FlatFileReaderDummyClass1的实例时,我希望IoC容器给我IMyCustomFileReaderIDummyInterface

同样,当供应商 Vendor2 时,我希望容器返回XMLFileReaderDummyClass2的实例。

我认为(当我错了时让我知道)我可以使用 ChildContainers 来使用它。目前我的xml看起来像这样:

<components>
  <component id="Vendor1"
             service="SomeAssembly.IMyCustomFileReader, SomeAssembly"
             type="SomeAssembly.Vendor1.Vendor1FlatFileReader, SomeAssembly.Vendor1">
  </component>
  <component id="Vendor1"
             service="SomeAssembly.IDummyInterface, SomeAssembly"
             type="SomeAssembly.DummyClass1, SomeAssembly">
  </component>

  <component id="Vendor2"
             service="SomeAssembly.IMyCustomFileReader, SomeAssembly"
             type="SomeAssembly.XMLFileReader, SomeAssembly">
  </component>
  <component id="Vendor2"
             service="SomeAssembly.IDummyInterface, SomeAssembly"
             type="SomeAssembly.DummyClass2, SomeAssembly">
  </component>
</components>

这种配置是错误的,因为我不能有多个具有相同 id 元素的组件 - 即使接口不同,如上例所示。我希望我可以执行类似Container.Resolve<IMyCustomFileReader>("Vendor1")的操作,然后当请求IMyCustomFileReader的实例且key值为 Vendor1 时,我会返回一个实例Vendor1FlatFileReader

当我尝试这样做时,我得到Castle.MicroKernel.ComponentRegistrationException

我认为可能有用的其他东西是ChildContainers的概念,但我如何在xml中配置呢?

此外,我不希望我的组件名称为Vendor1_IMyCustomFileReaderVendor2_IMyCustomFileReader。我也希望每个供应商只有一个配置文件而不是单独的配置文件(如果可能的话)。有没有其他人遇到过类似的问题?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

是的,组件ID必须是唯一的。除非你真的知道你在做什么,否则我不会推荐儿童容器。在这种情况下,看起来您正在尝试进行某种多租户,因此我建议您查看handler selectors,这样您就可以根据“供应商”选择合适的组件而无需借助服务位置(如果你在应用程序级代码中执行container.Resolve(),那么你已经丢失了。)

答案 1 :(得分:0)

您愿意使用fluent registration API吗?如果是这样,您可以根据“供应商”决定在运行时注册哪些组件(每个供应商的注册可以存在于单独的IWindsorInstaller实现中)。此解决方案假设您知道在启动时使用哪个“供应商”,并且“供应商”在应用程序的整个生命周期内都不会更改(我猜这是基于您如何陈述问题的有效假设)。您可以采用类似的XML配置方法,但是您需要将每个供应商的配置分成单独的配置文件,并且您说您反对这一点 - 您能澄清原因吗?

如果您认为流畅的API方法可行,请发表评论并告诉我,我很乐意发布一个示例。