在MEF之前,人們已經提出了許多依賴注入框架來解決應用的擴充套件性問題,比如OSGI 實現以Spring 等等。在 Microsoft 的平臺上,.NET Framework 自身內部包含元件模型和 System.Addin。同時存在若干種開源解決方案,包括 SharpDevelop 的 SODA 體系結構和“控制反轉”容器(如 Castle Windsor、Structure Map、Spring.Net 以及Unity)。

  雖然.NET平臺下,包括MS在內的各種方案已經遍地開花,但是MEF是第一個隨著CLR釋出的解決方案。

  官方說法: Managed Extensibility Framework(MEF)是.NET平臺下的一個擴充套件性管理框架,它是一系列特性的集合,包括依賴注入(DI)以及Duck Typing等。MEF為開發人員提供了一個工具,讓我們可以輕鬆的對應用程式進行擴充套件並且對已有的程式碼產生最小的影響,開發人員在開發過程中根據功能要求定義一些擴充套件點,之後擴充套件人員就可以使用這些擴充套件點與應用程式互動;同時MEF讓應用程式與擴充套件程式之間不產生直接的依賴,這樣也允許在多個具有同樣的擴充套件需求之間共享擴充套件程式。

  了一個月左右的休息時間將官方提供的MEF程式設計指南(The MEF Programming Guide)以及自己使用中的一些經驗進行了整理,為了方便大家閱讀特將此係列博文進行彙總,詳細如下博文列表。



  MEF程式設計指南一:在應用程式中宿主MEF

  本篇通過一個簡單的應用例項介紹瞭如何在應用程式中宿主MEF,以及最基本的匯入、匯出和部件組合的應用。 

  MEF程式設計指南二:Silverlight中使用CompositionInitializer宿主MEF

  本篇介紹瞭如何在Silverlight中使用CompositionInitializer宿主MEF,並通過不同的匯入匯出配置,演示了MEF的動態裝載配件組合和一些簡單的應用案例。 

  MEF程式設計指南三:MEF中組合部件(Composable Parts)與契約(Contracts)的基本應用

  本篇介紹瞭如何定義組合部件(Composable Parts)和契約(Contracts),以及基於契約的的多重元件部件的相關應用,包括介面的多實現,如何使用ImportManyAttribute特性通過契約獲取介面的多重實現例項等。最後還介紹了通過契約進行約束,實現裝配指定契約的部件。

  MEF程式設計指南四:使用MEF宣告匯出(Exports)與匯入(Imports)

  本篇介紹瞭如何使用MEF宣告匯出(Exports)與匯入(Imports),包括類、欄位、屬性以及方法級別的部件匯出、匯出的應用。

  MEF程式設計指南五:遲延(Lazy)載入匯出部件(Export Part)與後設資料(Metadata)

  本篇介紹了MEF中的遲延載入(Lazy)機制和後設資料(Metadata)匯出功能特性。

  MEF程式設計指南六:MEF中的目錄服務(DeploymentCatalog)

  對於MEF的目錄服務MEF分別為WPF和Silverlight提供了不同的目錄機制。使用目錄的主要功能就是方便實現程式部件的裝載,以及動態的組合應用程式部件等功能,更可以非常方便的得到程式部件的程式集、匯出部件等相關資料。

  MEF程式設計指南七:使用目錄(Catalog)動態裝載xap與目錄篩選(Filtered Catalog)

  如果不使用MEF進行託管擴充套件處理,只有通過WebClient進行程式包的下載、解析。實際上MEF的動態下載的底層實現一樣是使用的WebClient,然後利用AggregateCatalog進行動態組合。   

  MEF程式設計指南八:部件生命週期(Parts Lifetime)託管

  MEF中的每一個可進行動態裝配的匯出部件都是具有生命週期的,在沒有特別需求的情況下一般都沒有對生命週期進行管理,而實際上MEF已為每一個部件進行了預設的生命週期管理,MEF的生命週期分為三種:Any、Shared及NonShared,被定義在System.ComponentModel.Composition.CreationPolicy列舉物件中。

  MEF程式設計指南九:重組(Recomposition)MEF部件

  通過前面八篇程式設計指南的學習,相信大家都知道應用程式部件的組合都是在初始化的時候進行裝配的。如果當應用程式已經初始化完成了,此時又有新的部件被匯入且進行裝配,按照目前的實現方式就無法實現了,我們需要一種可以進行動態裝配、動態組合以及可以動態的進行新的部件被裝配組合的通知的功能,於此MEF所提供的重組(Recomposition)部件特性就可以派上用場了。

  MEF官方網站:http://mef.codeplex.com/