У меня есть импорт, который не работает - объект имеет значение null. Первоначально это был ImportMany, но я упростил его до импорта, чтобы попытаться определить проблему, но мне это не удалось.MEF Import is null
Я прошел через этот сайт, и Google, и затем основные идеи:
- Не экземпляр класса самостоятельно, пусть MEF сделать это, иначе называют container.getExport() - до сих пор не work
- Поместите [Export] в класс, содержащий свойство [Import], иначе он не будет выбран в качестве части процесса составления контейнера (подтвержденный при отладке).
Мой код настройки выглядит следующим образом (упрощенно ради компактности):
Ассамблеи1
public class MyBootstrapper
{
//Automatically called by ExcelDna library, I do not instantiate this class
public void AutoOpen()
{
var ac1 = new AssemblyCatalog(typeof(XLHandler).Assembly);
var ac2 = new AssemblyCatalog(typeof(MyComponent).Assembly);
var agc = new AggregateCatalog();
agc.Catalogs.Add(ac1);
agc.Catalogs.Add(ac2);
var cc = new CompositionContainer(agc);
try
{
cc.ComposeParts(this);
}
catch (CompositionException exception) {}
}
}
[Export]
public class XLHandler
{
[Import(typeof(IMyComponent))]
public IMyComponent _component;
public void SomeMethod()
{
//try to use _component but it is null
}
}
Assembly2
public interface IMyComponent
{
//stuff...
}
Ассамблеей3
[Export(typeof(IMyComponent)]
public MyComponent : IMyComponent
{
//more stuff...
}
Кто-нибудь знает/есть идея, почему переменная _component в XLHandler не вводится в в MEF контейнера?
Нужно ли мне экспортировать/создавать AssemblyCatalog для интерфейса в Assembly2?
Не уверен в этом, но атрибут импорта не должен быть '[Import (typeof (IMycomponent))]'? –
Да, вы экспортируете как 'IMyComponent', поэтому вы также должны импортировать его. Вы можете удалить определение типаof из импорта, потому что ваш тип переменной уже IMyComponent. – ChrisO
Yup, это была опечатка в Q. Я исправлю это. – clicky