24

我现在只是想了解托管可扩展性框架( MEF ) 并深入研究一下。我有 Eclipse 背景,所以在我的大脑中,我目前有以下等式:

MEF =~ OSGi for .NET

根据我目前所听到的。我在正确的路线上吗?

4

3 回答 3

19

Scott Hanselman 在他与 Glenn Block的播客 148中帮助突出了有关 MEF 的细节。

与 OSGi 相比,MEF 建立在“控制反转”之上,而OSGi不是:它 (OSGi) 将通过基于生命周期层的不同机制发现新的捆绑包。

MEF专注于应用程序的可扩展性。它使用 DI 作为组合不同扩展的策略,但它本身并不是通用的 DI 容器

由于最后一点可能令人困惑,播客的文字记录可以提供帮助:

不过,我基本上定位它的方式,两者之间的区别在于,IoC 容器实际上是关于在不同环境中管理一组已知的事物,比如我想要在我的磁盘环境中使用一个记录器,我想要在我的测试环境中使用一个模拟记录器.

所以 MEF 实际上是关于管理一组未知的事情,归结为,在 IoC 容器中,我倾向于做基于约定或注册的特定注册机制,这就是 logger 的意思,这就是这个意思是,这就是它的意思。

MEF 使用代码和代码上的发现机制和注释,它们是属性,无论系统中出现什么,它就是存在的。

所以再一次,把它带到更高的层次,它是关于你使用 MEF 来真正管理一组未知的东西,你使用 IoC 容器来管理一组已知的东西。

结论:(之一)主要区别在于发现原理(IoC 与生命周期)

于 2009-04-02T13:08:12.397 回答
6

请注意,OSGi 被设计为可以在其之上作为模块提供 IoC 容器,实际上,有多个用于 OSGi 的 IoC 容器以及其他机制:DS、iPOJO、Blueprint 等等。

于 2011-05-23T07:11:19.917 回答
2

只是偶然发现了这一点,但Prism似乎是我见过的 .NET 中最接近 OSGi 的东西!查看文档中的模块化应用程序开发部分。

看看他们的模块依赖示例(几乎等同于捆绑!):

<modules>
  <module assemblyFile="Modules/ModuleD.dll" moduleType="ModuleD.ModuleD, ModuleD" moduleName="ModuleD">
    <dependencies>
      <dependency moduleName="ModuleB"/>
    </dependencies>
</module>

微软的模式和实践团队似乎已经结束,相当于一种 OSGi 联盟。

于 2013-05-23T18:44:54.900 回答