MEF核心筆記(1)基礎應用


從接觸MEF到現在,已經有些年頭了,雖然有些年頭,但一直未在實際項目中使用,這可能是因為它的Framework框架太高,畢竟目前公司的主流項目都是用Framework 3.5。如此,冷落了它,有點可惜。最近可能會需要用到了,所以寫一些筆記,來讓自己熟悉起來。

題外話說一下,最近公司的小組里面一位成員要離開了,小組中也就我和他有對領域驅動設計有所研究,還沒好好合作一次呢,也真是可惜。的確,這世間就是有太多的可惜,也許,哪天不如意了,我也會離開。當然,這一切都是題外話,偶爾的傷感和牢騷后,我們應該繼續向前看,畢竟,向前看脖子才不酸(相比起仰視)。

廢話不多說了,下面,我們進入正題吧。

一、基本概念

  • MEF:Managed Extensibility Framework,.NET 4.0中帶來的一個基於托管的擴展程序開發框架(挺拗口的,不過只是概念),另外通過強大的百度百科,我們發現MEF還是“小鼠胚胎成纖維細胞”的簡稱(這貨是?)。
  • Contract:契約,即一種約定,具體在代碼中表現為接口和抽象類。自從進入.NET 4.0,契約這個單詞我們應該不會陌生,WCF中貫穿着各種契約,無論如何,契約就是一種約定。
  • Import:導入,導入契約的實現,說明此處需要一個實現的契約。
  • Export:導出,導出契約的實現,說明相應的類中實現了相應的契約。
  • Part:部件,即實現契約的類。
  • Catalog:目錄(我是這樣定義的),存放部件的地方,當需要某個部件時,會在目錄中尋找。
  • Container:容器,存放目錄並進行部件管理,如導出、導入等。
  • Compose:組裝,通過容器在目錄中尋找到實現了相應契約的部件,進行部件的組裝。

二、框架圖示

繪圖1

不是很會作圖,上面的圖就將就着看吧。一個Component Import了兩個Contract,分別是Contract 1和Contract 2,一個Catalog中有兩個Part並且Export了上訴的兩個Contract,最后,Component通過Container的Compose操作,實例化了兩個Contract。(我表述的不是很好,說的很拗口,但MEF是非常簡單的框架,堅持看下去,你一定會學會的)

三、基本使用示例

下面到了動手操作的時候了,打開Visual Studio,新建一個.NET 4的控制台項目【MyMEFApplication】,添加對MEF庫的引用,即“System.ComponentModel.Composition”。

1、添加一個契約

//這便是我們的契約 Contract
public interface ICalculator {

    int Add(int a, int b);

    int Sub(int a, int b);
}

2、實現這個契約

//此處我們導出了契約,這就是一個部件
   [Export(typeof(ICalculator))]
   public class MyCalculator : ICalculator {

       public int Add(int a, int b) {
           Console.WriteLine("Add Invoked");
           return a + b;
       }

       public int Sub(int a, int b) {
           Console.WriteLine("Sub Invoked");
           return a - b;
       }
   }

3、完成測試程序

class Program {

    private static CompositionContainer _container;

    static void Main(string[] args) {
        //AssemblyCatalog 目錄的一種,表示在相應的程序集中搜索
        var catalog = new AssemblyCatalog(typeof(Program).Assembly);
        _container = new CompositionContainer(catalog);

        MathCompute mathCompute = new MathCompute();
        _container.ComposeParts(mathCompute);//組裝部件

        Console.WriteLine(mathCompute.Add(1, 3));
        Console.WriteLine(mathCompute.Sub(3, 2));

        Console.ReadLine();
    }
}

public class MathCompute {

    //我們需要導入這個契約實現的部件
    [Import(typeof(ICalculator))]
    private ICalculator _calculator;


    public int Add(int a, int b) {
        return _calculator.Add(a, b);
    }

    public int Sub(int a, int b) {
        return _calculator.Sub(a, b);
    }

}

由於時間倉促,本次示例相當簡單,並且無實際意義,接下來的實例,我會盡量弄些有實際意義的東西。

四、總結

本篇筆記中,我們大致的了解了MEF的使用,並且完成了一個很無聊的應用程序。我們熟知了什么是導入、導出,什么是契約、容器,這樣就夠了。

源碼下載(訪問密碼:80fb)


免責聲明!

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



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