在應(yīng)用程序中宿主MEF其實(shí)非常簡(jiǎn)單,只需要?jiǎng)?chuàng)建一個(gè)組合容器對(duì)象(CompositionContainer)的實(shí)例,,然后將需要組合的部件(Parts)和當(dāng)前宿主程序添加到容器中即可,。首先需要添加MEF框架的引用,既System.ComponentModel.Composition.dll,,詳細(xì)如下代碼塊: private void Compose() { var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this); }
通過(guò)上面的代碼實(shí)現(xiàn)就可以完成MEF的宿主,,實(shí)際上在使用MEF的開(kāi)發(fā)過(guò)程中并不會(huì)如此簡(jiǎn)單的應(yīng)用??赡軙?huì)定義一個(gè)或多個(gè)導(dǎo)入(Import)和導(dǎo)出(Export)部件,,然后通過(guò)MEF容器進(jìn)行組合,其實(shí)也可以理解為“依賴注入”的一種實(shí)現(xiàn),。比如定義一個(gè)圖書接口和一個(gè)接口的實(shí)現(xiàn)類,,在此基礎(chǔ)上使用MEF的導(dǎo)入導(dǎo)出特性: public interface IBookService { void GetBookName(); } /// <summary> /// 導(dǎo)入 /// </summary> [Export(typeof(IBookService))] public class ComputerBookService : IBookService { public void GetBookName() { Console.WriteLine("《Hello Silverlight》"); } }
如上代碼通過(guò)使用MEF的[System.ComponentModel.Composition.Export]對(duì)接口的實(shí)現(xiàn)進(jìn)行導(dǎo)出設(shè)置,讓接口的實(shí)現(xiàn)以容器部件的方式存在,,然后通過(guò)組合容器進(jìn)行裝配加載,,這個(gè)過(guò)程中就包括了接口的實(shí)例化的過(guò)程。接下來(lái)就需要在MEF的宿主程序中定義一個(gè)接口的屬性,,并為其標(biāo)注[System.ComponentModel.Composition.Import]特性以實(shí)現(xiàn)接口實(shí)現(xiàn)類的導(dǎo)入,。如下代碼塊: /// <summary> /// 導(dǎo)入接口的實(shí)現(xiàn)部件(Part) /// </summary> [Import] public IBookService Service { get; set; }
完成了導(dǎo)入導(dǎo)出的接口與實(shí)現(xiàn)的開(kāi)發(fā)及特性配置,下面就剩下一步組合了,,也就是本文提到的將部件和宿主程序自身添加到組合容器中,,以實(shí)現(xiàn)導(dǎo)入(Import)和導(dǎo)出(Export)的組合裝配。 /// <summary> /// 宿主MEF并組合部件 /// </summary> private void Compose() { var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); //將部件(part)和宿主程序添加到組合容器 container.ComposeParts(this,new ComputerBookService()); }
通過(guò)以上步驟就完成了MEF的宿主以及一個(gè)簡(jiǎn)單的部件組合的應(yīng)用示例,下面是本文的完整代碼示例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Reflection; namespace HostingMef { public interface IBookService { void GetBookName(); } /// <summary> /// 導(dǎo)入 /// </summary> [Export(typeof(IBookService))] public class ComputerBookService : IBookService { public void GetBookName() { Console.WriteLine("《Hello Silverlight》"); } } class Program { /// <summary> /// 導(dǎo)入接口的實(shí)現(xiàn)部件(Part) /// </summary> [Import] public IBookService Service { get; set; } /// <summary> /// 宿主MEF并組合部件 /// </summary> private void Compose() { var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); //將部件(part)和宿主程序添加到組合容器 container.ComposeParts(this,new ComputerBookService()); } static void Main(string[] args) { Program p = new Program(); p.Compose(); p.Service.GetBookName(); } } } |
|
來(lái)自: personal_hcy > 《我的圖書館》