Ошибка импорта MEF - PullRequest
       28

Ошибка импорта MEF

1 голос
/ 14 ноября 2010

У меня есть простой сценарий экспорта / импорта, который я не могу понять, почему это не работает.в моем сценарии у меня есть одно приложение WPF и 2 ClassLibrary, в Classlib1 у меня есть один интерфейс с именем ITestEx1, как показано ниже:

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

и 1 производный класс Named (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 ]

1 голос
/ 14 ноября 2010

Если вы создадите TestMEF () самостоятельно, импорт не будет выполнен.Вы должны запросить его из контейнера:

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

В качестве альтернативы, вы можете добавить следующее свойство в класс MainWindow, и оно будет заполнено при вызове _container.ComposeParts (this) или _container.SatisfyImportsOnce (это):

[Import]
public ITestEx AA { get; set; }
0 голосов
/ 14 ноября 2010

Вы должны вытащить экземпляр из контейнера, а не создавать его самостоятельно.В этом случае вам понадобится фабрика (в контейнере) для создания объектов на лету.

...