我正在使用MEF 2开发一个应用程序。我想尝试无属性的设计插件的方法,现在我想弄清楚为什么我的一个对象似乎不满足它的Import。 以下是示例代码。
using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Registration;
using System.Reflection;
namespace MEF2
{
class Program
{
static void Main(string[] args)
{
var builder = new RegistrationBuilder();
builder.ForType<ExporterClass>().Export<ExporterClass>();
builder.ForType<ImporterClass>().Export().ImportProperties(p => p.Name == "Exporter");
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly(), builder);
CompositionContainer container = new CompositionContainer(catalog);
ImporterClass t = new ImporterClass();
container.ComposeParts(t);
t.ShowWalkers();
}
}
public class ExporterClass
{
public void Write()
{
Console.WriteLine("Test");
}
}
public class ImporterClass : IPartImportsSatisfiedNotification
{
//[Import]
private ExporterClass Exporter { get; set; }
public void ShowWalkers()
{
if (Exporter != null)
Exporter.Write();
}
public void OnImportsSatisfied()
{
Console.WriteLine("IPartImportsSatisfiedNotification");
}
}
}
触发了 OnInputSatisfied
事件,但Exporter属性仍然为null。如果我取消注释[Import]
属性,一切正常。
如果没有属性导入,我该怎么办?
答案 0 :(得分:2)
我不确定您是否可以将CompositionContainer.ComposeParts与MEF约定一起使用。我认为这仅适用于归因模型。
让您的示例替换:
ImporterClass t = new ImporterClass();
container.ComposeParts(t);
使用:
ImporterClass t = container.GetExportedValueOrDefault<ImporterClass>();
并将ImporterClass.Exporter
更改为public
。 MEF Conventions
仅允许在公共媒体资源上导入。