MEF 在 WPF 中的简单应用
MEF核心笔记MEF 的开发模式主要适用于插件化的业务场景中,C/S 和 B/S 中都有相应的使用场景,其中包括但不限于 ASP.NET MVC
、ASP WebForms
、WPF
、UWP
等开发框架。当然,DotNet Core
也是支持的。
以下是搜索到一些比较好的博文供参考:
MEF核心笔记
《MEF程序设计指南》博文汇总
先上效果图
一、新建解决方案
开始新建一个解决方案Mef,再添加一个winform项目为:MefDemo
如图:
打开Form1窗口,拉入MenuStrip菜单控件,把name改名为"ms",菜单控件什么菜单都不加,如下图:
接着双击窗口写如下代码:
private void Form1_Load(object sender, EventArgs e){ToolStripMenuItem item = new ToolStripMenuItem("插件");ms.Items.Add(item);foreach (IPlugin plugin in plugins){ToolStripMenuItem subItem = new ToolStripMenuItem(plugin.Text);subItem.Click += (s, arg) => { plugin.Do(); };item.DropDownItems.Add(subItem);}}
在继续写一个初始化插件代码:
private CompositionContainer _container;private void Init(){//设置目录,让引擎能自动去发现新的扩展var catalog = new AggregateCatalog();catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory+"plugin\\"));//创建一个容器,相当于是生产车间_container = new CompositionContainer(catalog);//调用车间的ComposeParts把各个部件组合到一起try{this._container.ComposeParts(this);//这里只需要传入当前应用程序实例就可以了,其它部分会自动发现并组装}catch (CompositionException compositionException){Console.WriteLine(compositionException.ToString());}}
Form1构造函数加入Init方法,程序刚启动时会从运行目录下plugin目录搜索所有dll文件并加载,plugin就是插件目录,所有插件都放到这个目录下
public Form1(){InitializeComponent();Init();}
二、新建接口类库PluginInterface
现在来创建一个接口项目(PluginInterface),它就像数据线或电源线一样,一端连接终端(手机、电脑),一端插到插座(电脑USB接口、插排),完全可以相像一下,手机在电脑充电的情形(它就需要一条数据线,一端连手机,一端连电脑)。
再新建一个接口IPlugin
public interface IPlugin{string Text { get; } //插件名称void Do(); //动作}
现在回到主程序,打开Form1窗口,写上如下代码:
需要引用System.ComponentModel.Composition
[ImportMany]public IEnumerable<IPlugin> plugins;
三、新建插件类库
现在可以来开发一个插件,为了方便,我在同一解决方案下创建,创建了一个Plugin1类库
再类库下新建一个类MyPlugin并实现IPlugin,有一点要注意,需要把MyPlugin命名空间改成和主程序一样
namespace MefDemo
{[Export(typeof(IPlugin))]public class MyPlugin:IPlugin{public string Text{get { return "插件1"; }}public void Do(){MessageBox.Show(Text);}}
}
同样的方法再创建2个插件类库,分别是Plugin2、Plugin3(winform)
插件类库编译后,复制dll到主程序plugin目录下
Demo下载
参考文章:[MEF插件式开发] 一个简单的例子 - 李子深 - 博客园