前言 小編菜鳥級別的程式員最近感慨頗多,經歷了三五春秋深知程式路途遙遠而我滄海一粟看不到的盡頭到不了的終點何處是我停留的驛站。說了段廢話下麵進入正題吧! 什麼是MEF? MEF:全稱Managed Extensibility Framework(托管可擴展框架)。單從名字我們不難發現MEF是專門致力 ...
前言
小編菜鳥級別的程式員最近感慨頗多,經歷了三五春秋深知程式路途遙遠而我滄海一粟看不到的盡頭到不了的終點何處是我停留的驛站。說了段廢話下麵進入正題吧!
什麼是MEF?
MEF:全稱Managed Extensibility Framework(托管可擴展框架)。單從名字我們不難發現MEF是專門致力於解決擴展性問題的框架。
MSDN:MEF(Managed Extensibility Framework)是一個用於創建可擴展的輕型應用程式的庫。 應用程式開發人員可利用該庫發現並使用擴展,而無需進行配置。 擴展開發人員還可以利用該庫輕鬆地封裝代碼,避免生成脆弱的硬依賴項。 通過 MEF,不僅可以在應用程式內重用擴展,還可以在應用程式之間重用擴展。
也有人把MEF解釋為“依賴註入”的一種方式,那麼什麼是“依賴註入”?
其實依賴註入就是我們日常所說的IOC/DI也就是IOC控制反轉,DI依賴註入這倆是一個概念不同的角度理解的意思,當然了IOC被稱為是一種思想並不是技術的實現而本章講解的MEF屬於IOC的一種大家可以吧IOC看作為一種編程“語言” 在編程語言中有很多的種類例如:C#,JAVA,C++等等。MEF就屬於IOC中的一種,還有很多其他的實現方式大家可以自行百度去找相關素材。
瞭解MEF只需要抓住以下幾個關鍵點:
(1)字面意思,可擴展的framework,或者叫可擴展的庫。也就是說,使用MEF是為了提高程式的可擴展性。MEF會根據指定的導入導出自動去發現匹配的擴展,不需要進行複雜的程式配置。
(2)在設計層面上來說,為什麼要使用MEF?為了“松耦合”!我們知道,程式設計有幾個原則,“高內聚,低耦合”就是其中一個。使用MEF可以幫助我們減少內庫之間的耦合。
MEF用法
(1)MEF基礎導入導出的使用: MEF的使用步驟主要分三步:宿主MEF並組合部件、標記對象的導出、對象的導入使用。
IBookService內容如下:
public interface IBookService { string BookName { get; set; } string GetBookName(); }
建立MusicBook繼承自IBookService
[Export(typeof(IBookService))] public class MusicBook : IBookService { public string BookName { get; set; } public string GetBookName() { return "jhtBOOK"; } }
建立測試類使用[Import]導入剛剛導出的MusicBook,下麵的Compose方法,實例化CompositionContainer來實現組合,需引用:
class Program { [Import] public IBookService Service { get; set; } static void Main(string[] args) { Program pro = new Program(); pro.Compose(); if (pro.Service != null) { Console.WriteLine(pro.Service.GetBookName()); } Console.Read(); } private void Compose() { //宿主MEF並組合部件 var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); CompositionContainer container = new CompositionContainer(catalog); //將部件(part)和宿主程式添加到組合容器 container.ComposeParts(this); } }
測試結果展現:
Composr:這個方法表示把當前Program這個類添加到組合容器,為什麼要添加到組合容器?是因為只要添加到組合容器中之後,如果該類裡面有Import,MEF才會自動去尋找對應的Export。這也就是為什麼使用MEF前必須要組合部件的原因。大家也就可以吧IOC容器理解為一個鍵值對存在的集合初始化之後需要用到的對象自動到IOC容器中去尋找。