2011-06-30 59 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属性。