MEF导入错误

时间:2010-11-14 14:17:17

标签: import mef

我有一些简单的导出/导入场景,我无法弄清楚为什么这不起作用。在我的场景中我有一个WPF应用程序和2个ClassLibrary,在Classlib1中我有一个名为ITestEx1的接口,如下所示:

public interface ITestEx1
{
  string Name {get; set;}
}

和1个派生类命名(TestEx1)如下:

using System.ComponentModel.Composition;

[Export(typeof(ITestEx1))]
public class TestEx1 : ITestEx
{
  public Name {get; set;}
}

你可以看到这个类被导出为ITestEx1的类型,现在在Classlib2中我引用了Classlib1并且有一个类如下:

using System.ComponentModel.Composition;
using Classlib1;

public class TestMEF
{
 [Import(typeof(ITestEx1))]
 public ITestEx1 TestE {get; set;}
}

并且在主WPF应用程序中我引用了Classlib1和ClassLib2,并且在MainWindow.xaml的构造函数中,我编写了用于初始化MEF的代码:

private CompositionContainer _container;

...

public MainWindow()
{ 
  InitializeComponent();
  var catalog = new AggregateCatalog();
  catalog.Catalogs.Add(new AssemblyCatalog(typeof(MainWindow).Assembly));
  catalog.Catalogs.Add(new AssemblyCatalog(typeof(TestEx1).Assemble));
  _container = new CompositionContainer(catalog)
  _container.ComposeParts(this);
}

...按下按钮我有这个:

{
  ...
  var aa = new TestMEF();
  aa.TestE.Name = "abc";    // Error, object null refrence
}

请帮我解决这个问题

2 个答案:

答案 0 :(得分:1)

如果您自己创建TestMEF(),则不会满足导入。您必须从容器中请求它:

var aa = _container.GetExport<ITestEx>();

或者,您可以将以下属性添加到MainWindow类中,并在调用_container.ComposeParts(this)或_container.SatisfyImportsOnce(this)时填充它:

[Import]
public ITestEx AA { get; set; }

答案 1 :(得分:0)

你必须从容器中取出实例,而不是自己创建它。在这种情况下,您需要一个工厂(在容器中)即时创建对象。