聲明:
本系列文章是通過網絡采集並加上本人的個人理解融合而成,都好幾年過去了感覺學習跟研究這個框架的人仍然很少,所以想寫一個小教程幫助大家一起提高。本人技術並不是很高深,如有偏差請多多指正。參考文章如下:
blogs.msdn.com/b/gblock/archive/tags/mef/
www.cnblogs.com/prinsun/tag/MEF/
http://www.cnblogs.com/wangchunming/category/341016.html
http://www.cnblogs.com/errorif/category/295552.html
http://www.cnblogs.com/beniao/archive/2010/08/11/1797537.html
有些章節內容屬於照搬,還請原創者原諒。也感謝其他朋友的分享。。。
-----------------------------------------------------------------------------
一、基本概念
MEF:Managed Extensibility Framework,.NET 4.0中帶來的一個基於托管的擴展程序開發框架, 其實MEF是為您的解決方案打破緊耦合的依賴。
Contract:契約,即一種約定,具體在代碼中表現為接口和抽象類。
Import:導入,是部件向要通過可用導出滿足的容器提出的要求, 可修飾字段、屬性或構造函數參數。
Export:導出,是部件向容器中的其他部件提供的一個值, 可修飾類、字段、屬性或方法。
注:
1.為了使導入與導出匹配,導入和導出必須具有相同的協定。 協定由一個字符串(稱為"協定名稱")和已導出或導入對象的類型(稱為“協定類型”)組成。只有在協定名稱和協定類型均匹配時,才會認為導出能夠滿足特定導入。
2.協定參數中的其中任意一個或兩者可能為隱式也可能為顯式。
3.通常應對公共類或成員聲明導出和導入。其他聲明也受支持,但如果導出或導入私有成員、受保護成員或內部成員,將會損壞部件的隔離模型,因此建議不要這樣做。
Part:部件,即實現契約的類。
Catalog:目錄(理解意義),存放部件的地方,當需要某個部件時,會在目錄中尋找。
Container:容器,存放目錄並進行部件管理,如導出、導入等。
Compose:組裝,通過容器在目錄中尋找到實現了相應契約的部件,進行部件的組裝。
二、框架圖示
三、基本使用示例
啟動 MEF 涉及以下幾個步驟:
添加需要容器創建的約定的導入。
創建 MEF 用於發現部件的目錄。
創建組合部件實例的容器。
通過對容器調用 Composeparts 方法並傳入具有導入的實例,來進行組合。
步驟1:創建新的控制台應用程序
MyConsoleMEF
第2步:添加引用
引用System.ComponentModel.Composition
步驟3:創建ILogger接口
代碼段

interface ILogger { void Write(string message); }
第4步:ILogger的實現
代碼段
public class ConsoleLogger : ILogger { void ILogger.Write(string message) { Console.WriteLine(message); } } public class DebugLogger : ILogger { void ILogger.Write(string message) { Debug.WriteLine(message); } } public class EventLogLogger : ILogger { void ILogger.Write(string message) { EventLog.WriteEntry("MEFSample", message); } }
步驟5:創建主程序
代碼段
class Program { public ILogger[] Loggers { get; private set; } static void Main(string[] args) { Program p = new Program(); foreach (var logger in p.Loggers) { logger.Write("寫日志"); } Console.Read(); } }
第6步:裝飾部分
步驟6.1:裝飾部分導出
下面的代碼是使用導出屬性的部分裝飾
要求為ILogger契約。
代碼段
[Export(typeof(ILogger))] public class ConsoleLogger : ILogger { void ILogger.Write(string message) { Console.WriteLine(message); } } [Export(typeof(ILogger))] public class DebugLogger : ILogger { void ILogger.Write(string message) { Debug.WriteLine(message); } } [Export(typeof(ILogger))] public class EventLogLogger : ILogger { void ILogger.Write(string message) { EventLog.WriteEntry("MEFSample", message); } }
步驟6.2:裝飾的需求
下面的代碼使用的是ImportMany特性,
代碼段
[ImportMany] public ILogger[] Loggers { get; private set; }
步驟7:組合
下面的代碼說明如何啟動在MEF組成過程。
下面的步驟用於靜態構造函數:
創建目錄 (告訴MEF尋找部件 )
創建容器 (主機),並交給目錄 。
容器調用Compose方法。
最后一步是從容器中獲得logger
代碼段
class Program { [ImportMany] public ILogger[] Loggers { get; private set; } static void Main(string[] args) { Program p = new Program(); var assemblyCatalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()); CompositionContainer container = new CompositionContainer(assemblyCatalog); var exports = container.GetExports<ILogger>(); foreach (var logger in p.Loggers) { logger.Write("寫日志"); } Console.Read(); } }
相關閱讀: