程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> MEF基礎概念學習筆記,mef概念學習筆記

MEF基礎概念學習筆記,mef概念學習筆記

編輯:C#入門知識

MEF基礎概念學習筆記,mef概念學習筆記


         MEF,是微軟.net框架下的一個框架類庫。可以使你的程序低耦合的加載擴展。在開發插件,或者開發一些需要靈活擴展的功能的時候經常用到。例如微軟給出的計算器的例子。當你開發計算器的時候,初始功能只提供了加減功能。但後來你要擴展乘法,除法功能。顯然,如果去改整個程序就會使問題變得麻煩,並且有不可預知的問題。所以微軟提供給我們使用MEF來通過動態加載擴展的方法來給程序增加新功能。另外,mef,也可以用來實現依賴注入,控制反轉。

      我們先從最簡單的DEMO開始學習mef.

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;

namespace MEFDEMO
{
    class Program
    {
        [Import]
        public string Message { get; set; }
        static void Main(string[] args)
        {
            Program program = new Program();
            program.Run();
        }
        public void Run()
        {
            var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
          
            Console.WriteLine(Message);
            Console.ReadKey();
        }
    }
    public class SimpleHello
    {
        [Export]
        public string Message
        {
            get { return "Hello World!"; }
        }
    }
}

     這是一個最簡單的例子。從上面可以看出一個簡單的mef實現由下面幾個部分組成

     1.   一個程序用來調用的入口      [Import] public string Message { get; set; }

     2.   方法的具體實現                 [Export]  public string Message{get { return "Hello World!"; }}

          方法的具體實現也就是我們可以動態增加的部分。和一般的接口實現相比,通過MEF的實現使其更靈活,更易擴展。可動態添加   

     3.   將上面兩個方法組合起來的,建立兩者之間的聯系。

           var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());

           var container = new CompositionContainer(catalog);

           container.ComposeParts(this);

    System.ComponentModel.Composition.Hosting.AggregateCatalog category = new System.ComponentModel.Composition.Hosting.AggregateCatalog(); foreach (var file in System.IO.Directory.GetFiles(@"C:\Users\wfm\Documents\Visual Studio 2013\Projects\WPFTest\TestReference\bin\Debug")) { if (file.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase)) { try { var assembly = Assembly.LoadFile(file); if (assembly == Assembly.GetCallingAssembly()) continue; category.Catalogs.Add(new System.ComponentModel.Composition.Hosting.AssemblyCatalog(assembly)); } catch { } } } Container = new CompositionContainer(category, true); this.Container.ComposeParts(this);

    

var container = new CompositionContainer(catalog);

      這句代碼創建了一個容器,創建容器很簡單,這要傳入一個ComposablePartCatalog類或者其子類就可以,也可以傳入ExportProvider類,具體的看該方法的重載。

container.ComposeParts(this);

      這裡ComposeParts是一個擴展方法。調用的時候省略第一個參數。所以這裡傳入的this,類型:System.Object[]要組合的特性化對象的數組。也就是把這兒的[Import]  public string Message { get; set; } 傳過去,然後容器就去尋找和該需要的導入對象匹配的導出對象。

      在這個例子中我們是用的container.ComposeParts(this);來組合的導入導出。但是還有其他方法。例如:
      container.SatisfyImportsOnce(this);
      container.Compose(batch);
      T 實例= Container.GetExportedValue<T>();然後通過實例去調用。

 

   

 

本文地址:http://www.cnblogs.com/santian/p/4355730.html

博客地址:http://www.cnblogs.com/santian/

轉載請以超鏈接形式標明文章原始出處。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved