托管可扩展性框架2012-04-22 MSDN Glenn Block在.NET 4中使用托管可扩展性框架构建可组合的应用程序托管可扩展性框架 (MEF) 是 .NET Framework 4 和 Silverlight 4 中新增的一个库,用于 简化在部署后可由第三方进行扩展的可组合系统的设计。MEF 可使您的应用程序具有开放性, 从而允许应用程序开发人员、框架编写者以及第三方扩展程序不断引入新功能。构建托管可扩展性框架的原因几年前,在 Microsoft 内部,一些小组致力于为一个问题找到解决方案,即如何基于可重 用的组件构建可动态发现、重用和组合的应用程序:Visual Studio 2010 当时在构建新的可扩展代码编辑器。该编辑器的核心功能以及第三方 功能都作为在运行时发现的二进制文件进行部署。核心要求之一是支持延迟加载扩展,以减少 启动时间和内存消耗。“Oslo”引入了“Intellipad”,这是一个可使用 MEF 的新增可扩展文本编辑器。在 Intellipad 中,插件要使用 IronPython 进行编写。Acropolis 提供用于构建复合应用程序的框架。Acropolis 运行时可在运行时发现应用程序 组件“部件”,并以松散耦合方式向这些部件提供服务。Acropolis 大量使用 XAML 来编写组 件。此问题并不是 Microsoft 所特有的。多年来,客户一直实现其自己的自定义可扩展性解决 方案。显然,这是很好的机会,平台可以步入这一领域,提供更通用的解决方案,有助于 Microsoft 和客户实现双赢。我们是否需要新事物?无论如何,MEF 不是此问题的第一种解决方案。人们提出过许多解决方案 — 跨越平台边界 的尝试数不胜数,涉及的工作包括 EJB、CORBA、Eclipse 的 OSGI 实现以及 Java 端的 Spring 等等。在 Microsoft 的平台上,.NET Framework 自身内部包含组件模型和 System.Addin。同时存在若干种开源解决方案,包括 SharpDevelop 的 SODA 体系结构和“控 制反转”容器(如 Castle Windsor、Structure Map 以及模式和实践的 Unity)。既然目前已有这些方法,为何还要引入新事物?这是因为我们意识到,我们当前的所有解决 方案对于常规第三方可扩展性都不理想。这些解决方案要么规模过大,不适合常规用途,要么 需要主机或扩展开发人员一方完成过多工作。MEF 在最大程度上秉承了所有这些解决方案的优 点,尝试解决刚才所提及的令人头痛的问题。让我们来看看 MEF 的核心概念,如图 1 所示。

图 1 托管可扩展性框架中的核心概念