MEF 是一个使开发人员能够创建“插件式应用程序”的技术,这里的“插件”是指在应用程序部署后开发人员能够通过开发“插件”来扩展应用程序功能。但不同之处是使用MEF框架您在系统设计阶段不需要考虑在应用程序部署后可能会有什么插件,MEF可以自动搜索这些插件。这也是为什么会叫他Managed Extensibility Framework。
一个简单的MEF示例,
假设系统中有如下需求
支付功能: 用户可以选择多种支付方式进行支付如支付宝,网银在线,财付通等等。
1. 定义支付接口及支付请求数据结构
2. 定义插件接口及插件元数据(用于标识插件信息)
3. 添加获取支付插件方法, 修改支付函数使支付支持多种支付方式
4.使用MEF实现支付接口
5. 编写第一个支付插件
6. 使用MEF容器注册插件
7. 目前系统中可用的插件只有“支付宝支付插件”,如果我们想添加一个新的网银在线插件
8. 插件元数据的定义:
9. 使用插件/刷新插件
- 拷贝需要的插件程序集至 ./bin/debug/plugins。(如Plugin.Payments.Echinabank.dll或 Plugin.Payments.Alipay.dll)MEF会自动加载plugins文件夹中的插件程序集。
- 刷新插件,拷贝新插件程序集至 ./bin/debug/plugins调用directoryCatalog.Refresh()函数. MEF会重新加载plugins文件夹中的插件程序集。
总结,MEF还是挺适合做.net程序的插件框架,使用MEF做插件主要有下面几个好处:
- 从.Net 4.0 开始微软已经把MEF内置在.Net Framework中,使用时只需要引用System.ComponentModel.Composition即可。
- 开源。
- 轻量级,不像Castle 或者 Spring之类的IoC使用起来比较复杂。
- 很容易实现动态搜索插件。
- 元数据功能使得插件有自描述能力不需要使用xml或者json来描述插件
相关资源
MEF 主页, MSDN 文档, MSDN 杂志 MEF vs IoC, .NET 4.0 MEF FAQ (Socket, Plug and extension)