mef意想不到的结果

时间:2011-06-30 17:28:52

标签: c# .net c#-4.0 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.";
        }
    }
} 

结果:

来自Extension1。 来自Extension2。

2 个答案:

答案 0 :(得分:2)

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

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

在这种情况下,MEF找到“字符串文本”并进行匹配。这是从Extention1发生的,但只是因为您明确地将导出添加到其Text属性

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

这会找到Export类型的实际IExtension。其中唯一一个是您的Extension2课程。这符合这一要求。

答案 1 :(得分:0)

Extension1声明它自己导出(类型为Extension1,而不是接口)并导出名为Text的属性为string的属性。

在合成中,它将绑定到标记为import的Text属性。

Extension2声明它导出类型IExtension。这将绑定到标记为导入IExtension的Ext属性。