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匹配您的导入的方式。既然你有:
[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属性。