2011-06-30 55 views
3

我是MEF的初學者。我寫這段代碼,但我不明白爲什麼程序顯示這個結果。mef中意外的結果

namespace ConsoleApplication1 
{ 
    public class MEFTest 
    { 
     [Import] 
     public string Text { get; set; } 

     [Import] 
     public IExtension Ext { get; set; } 

     public void ShowText() 
     { 
      AssemblyCatalog asscatalog = new AssemblyCatalog(typeof(Extension2).Assembly); 
      CompositionContainer container = new CompositionContainer(asscatalog); 

      CompositionBatch batch = new CompositionBatch(); 
      batch.AddPart(this); 

      container.Compose(batch); 

      Console.WriteLine(Text); 
      Console.WriteLine(Ext.Text); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MEFTest mef = new MEFTest(); 

      mef.ShowText(); 

      Console.ReadKey(); 
     } 
    } 

    public interface IExtension 
    { 
     string Text { get; set; } 
    } 

    [Export] 
    public class Extension1 : IExtension 
    { 
     [Export] 
     public string Text { get; set; } 

     public Extension1() 
     { 
      Text = "From Extension1."; 
     } 
    } 

    [Export(typeof(IExtension))] 
    public class Extension2 : IExtension 
    { 
     // [Export(typeof(IExtension).GetProperties()[0].GetType())] 
     public string Text { get; set; } 

     public Extension2() 
     { 
      Text = "From Extension2."; 
     } 
    } 
} 

結果:

從擴展1。 來自Extension2。

+0

是你的結果形式Extenstion1。表單Extension2? – Jethro

+0

Hazai,正如裏德所述,你必須刪除[Import] public string Text {get; set;}你不需要這個。 – Jethro

回答

2

這就是MEF如何匹配您的導入。既然你有:

[Import] 
    public string Text { get; set; } 

在這種情況下,MEF找到一個「字符串文本」並進行匹配。這種情況發生在Extention1中,但僅在之間,因爲你明確地向其Text屬性添加了一個導出。

[Import] 
    public IExtension Ext { get; set; } 

此發現IExtension類型的實際Export。其中唯一的是你的Extension2類。這滿足了這個要求。

+0

我想他說的是表單擴展名1和表單擴展名2正在顯示。 – Jethro

+0

@Jethro:是的,但他有兩個單獨的進口,並且正在同時打印。正如我上面所說,第一次導入找到Extension1,第二次找到Extension2。 –

+0

我明白了,所以發生的情況是,如果匹配Extension1文本屬性,則導入是。謝謝。 – Jethro

0

Extension1聲明它自己導出(類型爲Extension1,而不是接口),並導出名爲Text類型爲string的屬性。

在組合中,這將被綁定到標記爲導入的Text屬性。

Extension2聲明它導出類型IExtension。這將被綁定到標記爲導入IExtension的Ext屬性。