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插件式開發] 一個簡單的例子 - 李子深 - 博客園