一、示範概述 此示範初步介紹了MEF的基本使用,包括對MEF中的Export、Import和Catalog做了初步的介紹,並通過一個具體的Demo來展示MEF是如何?高內聚、低耦合和高擴充性的軟體架構。
示範中,針對於IBookService介面,有3個不同版本的實現,分別是ComputerBookServiceImp、HistoryBookServiceImp和MathBookServiceImp,然後通過MEF的匯入匯出及組裝機制,分別在這3個版本的實現間替換,而這種替換並未通過設定檔之類的輔助方式,使用起來,確實有它的方便之處。
相關下載(螢幕錄影): http://yunpan.cn/cZnDLgASnvTj8 訪問密碼 39e7
線上播放: http://v.youku.com/v_show/id_XOTIwNjkyNjY0.html
溫馨提示:如果螢幕錄影和代碼不能正常下載,可站內留言,或發郵件到524130780@QQ.COM
歡迎有興趣研究.NET相關技術的網友加QQ群:18507443
二、關鍵代碼
介面定義:
namespace Interface{ public interface IBookService { void GetBookName(); }}
針對於介面的3個實現,如下代碼所示:
using System;using System.ComponentModel.Composition;using Interface;namespace ComputerBookServiceImp{ [Export(typeof(IBookService))] public class ComputerBookService : IBookService { public void GetBookName() { Console.WriteLine("Computer Book"); } }}
上面代碼除了對介面的實現以外,有兩點需要說明的:
1、項目中引用了 System.ComponentModel.Composition程式集,使用MEF必須使用該程式集。
2、使用了 Export特性標記了ComputerBookService類,並且聲明其類型為IBookServivce,通過此特性說明該類是MEF的一個匯出組件。
其他兩個版本的實現和上面雷同,代碼如下:
HistoryBookServiceImp
using System;using System.ComponentModel.Composition;using Interface;namespace HistoryBookServiceImp{ [Export(typeof(IBookService))] public class HistoryBookService : IBookService { public void GetBookName() { Console.WriteLine("History Book"); } }}
MathBookServiceImp
using System;using System.ComponentModel.Composition;using Interface;namespace MathBookServiceImp{ [Export(typeof(IBookService))] public class MathBookService : IBookService { public void GetBookName() { Console.WriteLine("Math Book"); } }}
然後在修改控制台應用程式Proggram類的代碼如下所示:
using System.ComponentModel.Composition;using System.ComponentModel.Composition.Hosting;using Interface;namespace HostApp{ class Program { static void Main(string[] args) { Program program = new Program(); program.Compose(); program.BookService.GetBookName(); } [Import] public IBookService BookService { get; set; } /// <summary> /// 通過容器物件將宿主和組件組裝到一起。 /// </summary> public void Compose() { DirectoryCatalog directoryCatalog = new DirectoryCatalog("imps"); var container = new CompositionContainer(directoryCatalog); container.ComposeParts(this); } }}
上面的代碼有3點需要說明:
1、通過 Import特性標記BookService為一個匯入屬性,這樣MEF的容器在進行宿主和組件組裝的時候,將會尋找與之匹配的匯出組件,然後進行組裝。上述代碼所尋找的是類型與BooService類型相同的匯出組件。
2、通過使用DirectoryCatalog類指明要尋找的匯出組件位於應用程式根目錄下的imps子檔案夾中。
3、通過CompositionContainer的擴充方法ComposeParts()組裝宿主程式和匯出組件。在該方法執行前,BookService屬性值為null,運行後,如果找到匹配的匯出組件,則建立了該匯出組件的一個執行個體。
三、相關資源
1、MSDN官方資料: http://msdn.microsoft.com/zh-cn/library/dd460648(v=vs.110).aspx
2、參考了微軟MVP Bēniaǒ的文章《MEF程式設計指南一:在應用程式中宿主MEF》,訪問地址: http://www.cnblogs.com/beniao/archive/2010/07/03/1770276.html