Dependency injection 温莎能与另一个国际奥委会集装箱合作吗?

Dependency injection 温莎能与另一个国际奥委会集装箱合作吗?,dependency-injection,castle-windsor,Dependency Injection,Castle Windsor,在应用程序的核心部分,我们使用Castle Windsor来管理依赖关系。我们将从第三方加载插件,这些第三方可能使用自己的IoC容器。我们希望他们能够从核心接收依赖项,例如通过核心服务的构造函数注入,但也能从他们自己的IoC容器接收依赖项 似乎如果他们提供了一个服务提供商接口,Windsor可以使用它来解决未知的依赖关系,忽略结果(因为这些组件的生命周期是其他人的事情)并继续进行卡车运输 但我也确信,当你尝试这样的事情时,会出现一些非常微妙的地方。这是不必要的。如果您允许这些插件使用构造函数注入

在应用程序的核心部分,我们使用Castle Windsor来管理依赖关系。我们将从第三方加载插件,这些第三方可能使用自己的IoC容器。我们希望他们能够从核心接收依赖项,例如通过核心服务的构造函数注入,但也能从他们自己的IoC容器接收依赖项

似乎如果他们提供了一个服务提供商接口,Windsor可以使用它来解决未知的依赖关系,忽略结果(因为这些组件的生命周期是其他人的事情)并继续进行卡车运输


但我也确信,当你尝试这样的事情时,会出现一些非常微妙的地方。

这是不必要的。如果您允许这些插件使用构造函数注入从主机应用程序获取适当的服务,Castle Windsor可以正确连接插件。插件只是使用构造函数注入作为静态声明依赖项的一种方式,因此只要Windsor能够解决依赖项,插件就会收到它


每个插件内部发生的事情(包括使用其他容器)与宿主应用程序无关。

这是一个非常糟糕的想法。混合容器就像混合酒精——它永远不会有好的结局。这当然似乎会导致宿醉,但我们肯定不是第一个想要使用一个容器的应用程序,而是与选择另一个容器的库交朋友的应用程序。听起来我们正试图解决同样的问题。阅读此帖子:。您找到解决方案了吗?但是那些程序员可能希望使用IoC来注册他们自己的内部依赖关系,而核心IoC从未听说过这些依赖关系。MEF通过属性来解决此类问题。如果这种外接程序场景是应用程序的核心,那么它将更适合。事实上,问题是,即使我们都很认真,并且使用构造函数注入来获取依赖项,我们也会遇到这样的情况:没有一个容器知道所有这些依赖项,因此无法创建对象。我无法为MyThing(ICoreService s,IMyPluginService p)编写构造函数,因为核心容器可以满足s而不是p,插件容器也可以满足s而不是p。MEF不一定如此,因为它不使用配置,而是使用发现。只要有一个[Export]可以满足[Import]的要求,它们就会被匹配。当然,但是我们在任何地方都使用MEF——回到一个容器来管理它们。问题是关于使用多个容器。我是不是很笨?