1. 程式人生 > >[MEF]第01篇 MEF使用入門

[MEF]第01篇 MEF使用入門

一、演示概述

此演示初步介紹了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
溫馨提示:如果螢幕錄影和程式碼不能正常下載,可站內留言,或發郵件到[email protected]

歡迎有興趣研究.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



相關推薦

[MEF]01 MEF使用入門

一、演示概述 此演示初步介紹了MEF的基本使用,包括對MEF中的Export、Import和Catalog做了初步的介紹,並通過一個具體的Demo來展示MEF是如何實現高內聚、低耦合和高擴充套件性的軟體架構。 演示中,針對於IBookService介面,有3個不同版本的實

從蘇寧電器到卡巴斯基(後傳)01:講講我寫完那36故事之後的一些事

對於正傳部分的想法        我特意統計了一下,正傳的36篇文章,我花了三個月的時間寫作。故事的時間跨度長達十一年,我用了大概十七萬字來給大家講解。花了三個多月的時間,也就是在我研究生還沒有畢業的時候就開始寫了,一直到我正式入職才暫時完成了這個系

python學習01-20181030

這是本人的第一個python學習的部落格,由於python之前的基礎語法比較簡單,本人就選擇從python的資料結構開始。一下為學習筆記: print("-----------python的資料結構---------------") # 列表list # 定義 s = [1, 2, 3,

Gradle for Android ( Groovy入門 )

迄今為止,我們已經學些了眾多gradle構建的概念以及如何執行tasks。在這一章,我們將對這些概念有一個更深的理解,然後開始構建我們自己的tasks。一旦我們掌握瞭如何編寫自定義tasks,那麼我們就可以試著編寫自己的外掛,以達到在多個專案中複用的目的。 在我們建立傳

FreeRTOS系列2---FreeRTOS入門指南

FreeRTOS可以被移植到很多不同架構的處理器和編譯器。每一個RTOS移植都附帶一個已經配置好的演示例程,可以方便快速啟動開發。更好的是,每個演示例程都附帶一個說明網頁,提供如何定位RTOS演示工程原

[Telerik]RadDocking01 初步介紹RadDocking佈局控制元件

一、演示概述 此演示是有關於Telerik控制元件使用系列演示的第一個演示,初步展示了RadDocking控制元件的佈局功能,對應於Telerik自家所提供的Demo中的First Look這段內容。 希望通過此演示,能讓大家對RadDocking有一個初步的感覺。相關下載

SpringCloud系列01節之入門

開發十年,就只剩下這套架構體系了! >>>   

】ASP.NET MVC快速入門之安全策略(MVC5+EF6)

對象 code word 單身 script ticket bsp 金額 class 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門之

python進階1 函數入門

避免 活性 保持 分開 append 表達 按順序 lose item 知識內容: 1.函數的作用 2.函數的定義與調用 3.函數的返回值 4.函數的參數 一、函數的作用 1.復用代碼 將可能重復執行的代碼封裝成函數,並在需要執行的地方調用函數,不僅可以實現代碼的復

HTML基礎(0):HTML的入門知識

under 簽到 spa 重要 img 大量 ack BE mage 學習HTML需要做的準備工作(1) 了解HTML: What(是什麽)? ①HTML(Hyper Text Markup Language,是超文本標記語言,本質其實就是文本,需要瀏覽器將它解釋成具體的網

】ASP.NET MVC快速入門之完整示例(MVC5+EF6)

redirect name php sql語句 rop 方法 輸入框 一次 編輯 目錄 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門

Docker-docker-compose教程(介紹,安裝,入門示例)

文章目錄 docker-compose介紹 docker-compose安裝 安裝docker(已安裝最新的請忽略此步驟) docker-compose安裝與解除安裝 docker-compose簡單示例 d

Java Web的框架入門

       時間過得很快,轉眼就來到了9月,大四開始了,這個時候比以往的時候都要更焦慮和不安,後面才發現慢慢來,其實一切都來的及。前提是你要主動去學習,於是Java的一些框架我覺得是時候學習了,通過百度的搜尋,發現Java Web 開發主要是有2種主流,

【OpenCV入門指南】 影象的二值化

【OpenCV入門指南】第四篇 影象的二值化    在上一篇《【OpenCV入門指南】第三篇Canny邊緣檢測》中介紹了使用Canny運算元對影象進行邊緣檢測。與邊緣檢測相比,輪廓檢測有時能更好的反映影象的內容。而要對影象進行輪廓檢測,則必須要先對影象進行二值化,影象的二值化就是

“毛星雲OpenCV3程式設計入門之python實現”讀取視訊+呼叫攝像頭

1.6.1讀取視訊+呼叫攝像頭 # -*- coding: gbk -*- __author__ = 'sunzhilong' import cv2 #讀取視訊,以幀顯示 cap = cv2.VideoCapture("E:/Study/python/Open

“毛星雲OpenCV3程式設計入門之python實現”基本圖形繪製

4.3基本圖形繪製 python程式碼: # -*- coding: utf-8 -*- __author__ = 'sunzhilong' import cv2 import numpy as np image = np.zeros((600,600,3

“毛星雲OpenCV3程式設計入門之python實現”影象拆分、合併

5.3影象拆分、合併 python程式碼: # -*- coding: utf-8 -*- import cv2 import numpy as np srcImage = cv2.imread("E:/Study/python/OpenCV_study/i

“毛星雲OpenCV3程式設計入門之python實現”亮度、對比度

5.4亮度、對比度 python程式碼: # -*- coding: utf-8 -*- import cv2 import numpy as np gcontrastvalue = 80 # 對比度 gbrightvalue = 80

《Java從入門到精通 魔力科技著》之1 Java概述

       1991 年Sun公司的James Gosling等人開始開發名稱為 Oak 的語言,希望用於控制嵌入在有線電視交換盒、PDA等的微處理器;        1994年將Oak語言更名為Java; Java的三種技術架構:        JAVAEE:J

《Java從入門到精通 魔力科技著》之5 Java常用類

API:(Application Programming Interface,應用程式程式設計介面)是一些預先定義的函式,目的是提供應用程式與開發人員基於某軟體或硬體的以訪問一組例程的能力,而又無需訪問原始碼,或理解內部工作機制的細節。 --< java.lang