在應用程式中宿主MEF
Managed Extensibility Framework(MEF)是.NET平台下的一個擴充性管理架構,他的特點如下:
1、.net下的一個可擴充行管理架構,包括了依賴注入和Duck Typing。
2、 輕鬆應對應用程式擴充並且對已有代碼產生最小影響。
3、 應用程式和擴充程式之間不產生直接依賴,多個同樣需求共用擴充程式。
參照http://mef.codeplex.com上面的教程嘗試實現了一個樣本
實現的步驟如下:
1、建立一個wpf的Console Application,宿主就是Program class
2、添加System.ComponentModel.Composition程式集和相關引用
3、添加一個Compone()方法,建立組合容器
4、添加一個方法,調用Compone()方法
5、在Main方法裡執行個體化宿主
6、定義在宿主中匯出的組件
7、在宿主中匯出組件
8、添加組件到容器,方法有二
1.直接添加組合組件執行個體
2.使用目錄添加組合組件
實現代碼:
using System;using System.ComponentModel.Composition;using System.ComponentModel.Composition.Hosting;namespace MEFConsole{ /// <summary> /// 宿主 /// </summary> class Program { static void Main(string[] args) { Program p = new Program(); p.Run1(); p.Run2(); } /// <summary> /// 匯入 /// </summary> [Import] public IWaiter waiter { get; set; } /// <summary> /// 執行個體化組合容器 /// 直接添加組件 /// </summary> private void Compone1() { var container = new CompositionContainer(); container.ComposeParts(this, new Waiter()); } /// <summary> /// 測試直接添加組件方法 /// </summary> public void Run1() { Console.WriteLine("直接添加組件到容器方式:"); Compone1(); waiter.Welcome(); waiter.Serve("糖醋裡脊"); waiter.GoodBye(); Console.WriteLine(); //Console.Read(); } /// <summary> /// 執行個體化組合容器類 /// 通過目錄添加組件 /// </summary> private void Compone2() { var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()); var container2 = new CompositionContainer(catalog); container2.ComposeParts(this); } /// <summary> /// 測試通過目錄添加控制項 /// </summary> public void Run2() { Console.WriteLine("通過目錄添加組件到容器方式:"); Compone2(); waiter.Welcome(); waiter.Serve("糖醋裡脊"); waiter.GoodBye(); Console.Read(); } } /// <summary> /// 聲明服務員介面 /// </summary> public interface IWaiter { void Welcome(); void Serve(string name); void GoodBye(); } /// <summary> /// 服務員類 /// 標記為匯出 /// </summary> [Export(typeof(IWaiter))] public class Waiter : IWaiter { public void Welcome() { Console.WriteLine("歡迎光臨!"); } public void Serve(string name) { Console.WriteLine("先生您點的菜" + name + "來了,請慢用!"); } public void GoodBye() { Console.WriteLine("歡迎下次光臨!"); } }}
執行結果: