# 【资料整理】MEF

- URL: https://www.yidoo.xyz/documentation-mef
- 作者: 核动力蜗牛
- 发布时间: 2010-09-04
- 更新时间: 2010-09-04
- 分类: 技术笔记
- 标签: csharp

**什么是 MEF？**

Managed Extensibility Framework（MEF）可以很容易的构造可扩展性的应用程序。MEF 提供了发现和组合能力，因此你可以选择来加载插件。

**MEF 解决了什么问题？**

- MEF 赠送了一种简单的在运行时扩展问题。直到现在，任何程序你想支持插件模式，需要构建自己的架构。这些插件经常是特定应用的并且不能被多种实现重用的。
- MEF 提供一个标准方式来让程序暴露自己，消耗外部扩展。扩展，天生的，能被不同的程序重用。然而，一个扩展需要实现特定应用。扩展可以依赖另一个扩展，MEF 确保它们以正确的顺序同时被装配。
- MEF 允许在查询和筛选中使用额外的元数据来标记扩展。

**MEF 如何工作？**

- 粗略的说，MEF 的核心由一个 catalog（目录）和一个 CompositionContainer 组成。一个 catalog 负责查找扩展，container 负责协调创建和符合的依赖。
- MEF 第一个类是 ComposablePart。一个 Composable part 提供了一个或多个 Exports，也可以依赖于一个或多个由 Imports 提供的扩展。一个 composable part 也管理可以是 object 或给定类型的实例。MEF，然而，是一个可扩展的，额外的 ComposablePart 实现，它依附于 Import/Export 契约。
- Exports 和 Imports 每个都有一个契约(Contract)。契约(Contract)是 exports 和 Imports 之间的桥梁。一个 export 契约由用来过滤的元数据组成。例如，它可以指定一个 export 提供的指定能力。
- MEF 的容器和 Catalogs 交互来访问 composable parts。容器自己解决一部分依赖并暴露 Exports 给外界。如果你愿意，你可以自由去增加 composable part 的实例。
- 一个 ComposablePart 返回一个 catalog，它在你的程序中很像一个扩展。它有宿主程序提供的 Imports，然后 Export 其他。
- 默认 MEF composable part 实现使用 attribute 元数据来声明 exports 和 imports。这允许 MEF 来决定哪个 parts, imports 和 exports 是完全可用的。
