mef中出现意外结果

本文关键字:意外 结果 mef | 更新日期: 2023-09-27 18:00:42

我是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。

mef中出现意外结果

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

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

在这种情况下,MEF会找到一个"字符串文本"并进行匹配。这种情况发生在Extention1中,但只是因为您显式地将导出添加到其Text属性中。

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

这将找到类型为IExtension的实际Export。其中唯一的一个是您的Extension2类。这就满足了这一要求。

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

在合成中,这将绑定到标记为导入的Text属性。

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