【问题标题】:Use IoC container for plugin architecture使用 IoC 容器进行插件架构
【发布时间】:2011-06-25 04:45:10
【问题描述】:

如果我错了,请纠正我,但 MEF 仅适用于管理一组可以自动发现和自动连接的未知事物(插件)。对于未来的项目,我们将需要一个真正的 IoC 容器来显式配置应用程序的已知部分(MEF 不擅长),但另外我们还需要支持自动发现的插件(如果可能的话,最好是不带属性的 POCO) .

IoC 容器能否轻松/默认支持此功能?如果是这样,你能给一个 有关如何在 Unity 和 StructureMap 中完成此操作的快速提示?这就是我们目前偏爱的两个。我们真的很想避免对 IoC 容器 MEF的依赖。

【问题讨论】:

  • 对插件使用 MEF 有什么问题?它专为该用例及其 .Net 框架的一部分而设计。
  • 您说您希望避免使用 IoC 容器和 MEF,所以我不会将此作为答案发布。但是Autofac 与 MEF 集成得非常好。

标签: c# .net ioc-container mef


【解决方案1】:

我认为重要的是要注意,虽然 MEF 不是传统意义上的 IoC 容器,但它正在执行控制反转。事实上,我不同意这一点,并说 MEF 是一个 IoC 容器,就像任何其他容器一样。说 Unity 和 MEF 之间的真正区别在于,默认情况下,MEF 支持基于显式类型解析的组合,以及基于配置的类型发现。但是,正如我们在 MEFContrib 项目中看到的那样,完全有可能让 MEF 表现得更像一个传统的 IoC 容器。 MEF 为您提供了一个很好的模块化组件行为基准,消除了许多繁重的移植,并且它的设计方式允许您添加更多功能。例如,假设您有围绕另一个 IoC 容器或服务定位器构建的现有代码库,您可以连接 ExportProvider 这样做,哎呀,您可以将提供者连接到服务定位器,例如 Common Service Locator 项目,然后插入兼容的 CSL 实现,并让 MEF 使用从其他 IoC 容器派生的类型组成组件。 MEF 还为您执行依赖注入。

如果您想避免依赖于特定的 IoC 容器或 MEF 本身,您始终可以使用 Common Service Locator 之类的东西,它是对常见容器操作的抽象。这样,如果您需要/想要更改将所有内容连接在一起的方式,那将相对轻松。大多数 IoC 容器和 MEF 都有兼容的 CSL 实现。

希望对您有所帮助。

【讨论】:

  • MEF Contrib 是否允许零件成为没有属性的 POCO?
  • 属性模型只是 MEF 的默认编程模型。 MEFContrib 有一个ConventionCatalog,它结合PartRegistry 允许您注册更像容器的类型,如 Unity/Autofac/Windsor 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 2012-09-16
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多