從接觸MEF到現在,已經有些年頭了,雖然有些年頭,但一直未在實際項目中使用,這可能是因為它的Framework框架太高,畢竟目前公司的主流項目都是用Framework 3.5。如此,冷落了它,有點可惜。最近可能會需要用到了,所以寫一些筆記,來讓自己熟悉起來。
題外話說一下,最近公司的小組里面一位成員要離開了,小組中也就我和他有對領域驅動設計有所研究,還沒好好合作一次呢,也真是可惜。的確,這世間就是有太多的可惜,也許,哪天不如意了,我也會離開。當然,這一切都是題外話,偶爾的傷感和牢騷后,我們應該繼續向前看,畢竟,向前看脖子才不酸(相比起仰視)。
廢話不多說了,下面,我們進入正題吧。
一、基本概念
- MEF:Managed Extensibility Framework,.NET 4.0中帶來的一個基於托管的擴展程序開發框架(挺拗口的,不過只是概念),另外通過強大的百度百科,我們發現MEF還是“小鼠胚胎成纖維細胞”的簡稱(這貨是?)。
- Contract:契約,即一種約定,具體在代碼中表現為接口和抽象類。自從進入.NET 4.0,契約這個單詞我們應該不會陌生,WCF中貫穿着各種契約,無論如何,契約就是一種約定。
- Import:導入,導入契約的實現,說明此處需要一個實現的契約。
- Export:導出,導出契約的實現,說明相應的類中實現了相應的契約。
- Part:部件,即實現契約的類。
- Catalog:目錄(我是這樣定義的),存放部件的地方,當需要某個部件時,會在目錄中尋找。
- Container:容器,存放目錄並進行部件管理,如導出、導入等。
- Compose:組裝,通過容器在目錄中尋找到實現了相應契約的部件,進行部件的組裝。
二、框架圖示
不是很會作圖,上面的圖就將就着看吧。一個Component Import了兩個Contract,分別是Contract 1和Contract 2,一個Catalog中有兩個Part並且Export了上訴的兩個Contract,最后,Component通過Container的Compose操作,實例化了兩個Contract。(我表述的不是很好,說的很拗口,但MEF是非常簡單的框架,堅持看下去,你一定會學會的)
三、基本使用示例
下面到了動手操作的時候了,打開Visual Studio,新建一個.NET 4的控制台項目【MyMEFApplication】,添加對MEF庫的引用,即“System.ComponentModel.Composition”。
1、添加一個契約
//這便是我們的契約 Contract public interface ICalculator { int Add(int a, int b); int Sub(int a, int b); }
2、實現這個契約
//此處我們導出了契約,這就是一個部件 [Export(typeof(ICalculator))] public class MyCalculator : ICalculator { public int Add(int a, int b) { Console.WriteLine("Add Invoked"); return a + b; } public int Sub(int a, int b) { Console.WriteLine("Sub Invoked"); return a - b; } }
3、完成測試程序
class Program { private static CompositionContainer _container; static void Main(string[] args) { //AssemblyCatalog 目錄的一種,表示在相應的程序集中搜索 var catalog = new AssemblyCatalog(typeof(Program).Assembly); _container = new CompositionContainer(catalog); MathCompute mathCompute = new MathCompute(); _container.ComposeParts(mathCompute);//組裝部件 Console.WriteLine(mathCompute.Add(1, 3)); Console.WriteLine(mathCompute.Sub(3, 2)); Console.ReadLine(); } } public class MathCompute { //我們需要導入這個契約實現的部件 [Import(typeof(ICalculator))] private ICalculator _calculator; public int Add(int a, int b) { return _calculator.Add(a, b); } public int Sub(int a, int b) { return _calculator.Sub(a, b); } }
由於時間倉促,本次示例相當簡單,並且無實際意義,接下來的實例,我會盡量弄些有實際意義的東西。
四、總結
本篇筆記中,我們大致的了解了MEF的使用,並且完成了一個很無聊的應用程序。我們熟知了什么是導入、導出,什么是契約、容器,這樣就夠了。