MEF,是微軟.net框架下的一個框架類庫。可以使你的程序低耦合的加載擴展。在開發插件,或者開發一些需要靈活擴展的功能的時候經常用到。例如微軟給出的計算器的例子。當你開發計算器的時候,初始功能只提供了加減功能。但後來你要擴展乘法,除法功能。顯然,如果去改整個程序就會使問題變得麻煩,並且有不可預知的問題。所以微軟提供給我們使用MEF來通過動態加載擴展的方法來給程序增加新功能。另外,mef,也可以用來實現依賴注入,控制反轉。
我們先從最簡單的DEMO開始學習mef.
using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Reflection; namespace MEFDEMO { class Program { [Import] public string Message { get; set; } static void Main(string[] args) { Program program = new Program(); program.Run(); } public void Run() { var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this); Console.WriteLine(Message); Console.ReadKey(); } } public class SimpleHello { [Export] public string Message { get { return "Hello World!"; } } } }
這是一個最簡單的例子。從上面可以看出一個簡單的mef實現由下面幾個部分組成
1. 一個程序用來調用的入口 [Import] public string Message { get; set; }
2. 方法的具體實現 [Export] public string Message{get { return "Hello World!"; }}
方法的具體實現也就是我們可以動態增加的部分。和一般的接口實現相比,通過MEF的實現使其更靈活,更易擴展。可動態添加
3. 將上面兩個方法組合起來的,建立兩者之間的聯系。
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
System.ComponentModel.Composition.Hosting.AggregateCatalog category = new System.ComponentModel.Composition.Hosting.AggregateCatalog(); foreach (var file in System.IO.Directory.GetFiles(@"C:\Users\wfm\Documents\Visual Studio 2013\Projects\WPFTest\TestReference\bin\Debug")) { if (file.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase)) { try { var assembly = Assembly.LoadFile(file); if (assembly == Assembly.GetCallingAssembly()) continue; category.Catalogs.Add(new System.ComponentModel.Composition.Hosting.AssemblyCatalog(assembly)); } catch { } } } Container = new CompositionContainer(category, true); this.Container.ComposeParts(this);
var container = new CompositionContainer(catalog);
這句代碼創建了一個容器,創建容器很簡單,這要傳入一個ComposablePartCatalog類或者其子類就可以,也可以傳入ExportProvider類,具體的看該方法的重載。
container.ComposeParts(this);
這裡ComposeParts是一個擴展方法。調用的時候省略第一個參數。所以這裡傳入的this,類型:System.Object[]要組合的特性化對象的數組。也就是把這兒的[Import] public string Message { get; set; } 傳過去,然後容器就去尋找和該需要的導入對象匹配的導出對象。
在這個例子中我們是用的container.ComposeParts(this);來組合的導入導出。但是還有其他方法。例如:
container.SatisfyImportsOnce(this);
container.Compose(batch);
T 實例= Container.GetExportedValue<T>();然後通過實例去調用。
本文地址:http://www.cnblogs.com/santian/p/4355730.html
博客地址:http://www.cnblogs.com/santian/
轉載請以超鏈接形式標明文章原始出處。