[MEF]第01篇 MEF使用入門

來源:互聯網
上載者:User


一、示範概述 此示範初步介紹了MEF的基本使用,包括對MEF中的Export、Import和Catalog做了初步的介紹,並通過一個具體的Demo來展示MEF是如何?高內聚、低耦合和高擴充性的軟體架構。
示範中,針對於IBookService介面,有3個不同版本的實現,分別是ComputerBookServiceImp、HistoryBookServiceImp和MathBookServiceImp,然後通過MEF的匯入匯出及組裝機制,分別在這3個版本的實現間替換,而這種替換並未通過設定檔之類的輔助方式,使用起來,確實有它的方便之處。
相關下載(螢幕錄影): http://yunpan.cn/cZnDLgASnvTj8 訪問密碼 39e7
線上播放: http://v.youku.com/v_show/id_XOTIwNjkyNjY0.html
溫馨提示:如果螢幕錄影和代碼不能正常下載,可站內留言,或發郵件到524130780@QQ.COM

歡迎有興趣研究.NET相關技術的網友加QQ群:18507443

二、關鍵代碼

介面定義:

namespace Interface{    public interface IBookService    {        void GetBookName();    }}

針對於介面的3個實現,如下代碼所示:
using System;using System.ComponentModel.Composition;using Interface;namespace ComputerBookServiceImp{    [Export(typeof(IBookService))]    public class ComputerBookService : IBookService    {        public void GetBookName()        {            Console.WriteLine("Computer Book");        }    }}

上面代碼除了對介面的實現以外,有兩點需要說明的:
1、項目中引用了 System.ComponentModel.Composition程式集,使用MEF必須使用該程式集。
2、使用了 Export特性標記了ComputerBookService類,並且聲明其類型為IBookServivce,通過此特性說明該類是MEF的一個匯出組件。

其他兩個版本的實現和上面雷同,代碼如下:

HistoryBookServiceImp
using System;using System.ComponentModel.Composition;using Interface;namespace HistoryBookServiceImp{    [Export(typeof(IBookService))]    public class HistoryBookService : IBookService    {        public void GetBookName()        {            Console.WriteLine("History Book");        }    }}

MathBookServiceImp
using System;using System.ComponentModel.Composition;using Interface;namespace MathBookServiceImp{    [Export(typeof(IBookService))]    public class MathBookService : IBookService    {        public void GetBookName()        {            Console.WriteLine("Math Book");        }    }}

然後在修改控制台應用程式Proggram類的代碼如下所示:
using System.ComponentModel.Composition;using System.ComponentModel.Composition.Hosting;using Interface;namespace HostApp{    class Program    {        static void Main(string[] args)        {            Program program = new Program();            program.Compose();            program.BookService.GetBookName();        }        [Import]        public IBookService BookService { get; set; }        /// <summary>        /// 通過容器物件將宿主和組件組裝到一起。        /// </summary>        public void Compose()        {            DirectoryCatalog directoryCatalog = new DirectoryCatalog("imps");            var container = new CompositionContainer(directoryCatalog);            container.ComposeParts(this);        }    }}

上面的代碼有3點需要說明:
1、通過 Import特性標記BookService為一個匯入屬性,這樣MEF的容器在進行宿主和組件組裝的時候,將會尋找與之匹配的匯出組件,然後進行組裝。上述代碼所尋找的是類型與BooService類型相同的匯出組件。
2、通過使用DirectoryCatalog類指明要尋找的匯出組件位於應用程式根目錄下的imps子檔案夾中。
3、通過CompositionContainer的擴充方法ComposeParts()組裝宿主程式和匯出組件。在該方法執行前,BookService屬性值為null,運行後,如果找到匹配的匯出組件,則建立了該匯出組件的一個執行個體。

三、相關資源
1、MSDN官方資料: http://msdn.microsoft.com/zh-cn/library/dd460648(v=vs.110).aspx
2、參考了微軟MVP Bēniaǒ的文章《MEF程式設計指南一:在應用程式中宿主MEF》,訪問地址: http://www.cnblogs.com/beniao/archive/2010/07/03/1770276.html



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.