MEF框架學習之旅(一)概念


聲明:

本系列文章是通過網絡采集並加上本人的個人理解融合而成,都好幾年過去了感覺學習跟研究這個框架的人仍然很少,所以想寫一個小教程幫助大家一起提高。本人技術並不是很高深,如有偏差請多多指正。參考文章如下:

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:組裝,通過容器在目錄中尋找到實現了相應契約的部件,進行部件的組裝。

 

二、框架圖示

 untitled

三、基本使用示例

啟動 MEF 涉及以下幾個步驟:

添加需要容器創建的約定的導入。

創建 MEF 用於發現部件的目錄。

創建組合部件實例的容器。

通過對容器調用 Composeparts 方法並傳入具有導入的實例,來進行組合。

 

步驟1:創建新的控制台應用程序

 MyConsoleMEF

2步:添加引用

引用System.ComponentModel.Composition

  

步驟3:創建ILogger接口

代碼段

  interface ILogger

    {

        void Write(string message);

    }
View Code

 

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();

        }

 

    }

 

相關閱讀:

MEF框架學習之旅(十一)調試

MEF框架學習之旅(十)重組

MEF框架學習之旅(九)部件生命周期及組裝通知

MEF框架學習之旅(八)避免發現

MEF框架學習之旅(七)部件的創建規則(策略)

MEF框架學習之旅(六)元數據和元數據視圖

MEF框架學習之旅(五)導入導出(下)

MEF框架學習之旅(四)導入導出(上)

MEF框架學習之旅(三)組合

MEF框架學習之旅(二)契約

MEF框架學習之旅(一)概念


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM