0

У меня есть служба Windows, и я инъекционный модуль к нему:Инъекционного модуль, который содержит впрыскиваются модуль, используя Mef2

private ICoupon _couponManager; 
... 
DirectoryCatalog catalog = new DirectoryCatalog(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins")); 
_container = new CompositionContainer(catalog); 
_couponManager = _container.GetExportedValue<ICoupon>();// Here I'm getting an exception 

Но модуль, который я пытаюсь импортировать это Constructer впрыскивается модуль :

[Import(typeof(IWallet))] 
private IWallet _iWallet; 

private static CompositionContainer _container; 

public CouponManager() 
{ 
    DirectoryCatalog catalog = new DirectoryCatalog(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins")); 
    _container = new CompositionContainer(catalog); 
    _container.ComposeParts(); 
} 

Так я получаю «исключение при попытке создать экземпляр типа„X.Business.CouponManager“.» ошибка. Как мне добавить свой модуль?

Я не уверен, если мой вопрос ясен, если нет, просьба уточнить подробности.

Спасибо заранее,

Edit: Интересная часть: я могу вводить этот модуль для моего ASP.NET MVC приложения и использовать его без проблем.

ответ

1

в дополнение к Жиля ответить на ваш класс должен выглядеть следующим образом

[Export(typeof(ICoupon))] 
public class CouponManager : ICoupon 
{ 
    private IWallet _iWallet; 

    [ImportingConstructor] 
    public CouponManager(IWallet iwallet) 
    { 
    this._iWallet= iwallet; 
    } 
} 
+0

Я попробовал ваше предложение, но я все равно получаю то же исключение. Есть ли у вас какие-либо другие идеи? – anilca

+1

отлаживать контейнер перед вызовом GetExportedValue. Я предполагаю, что у вас есть только настройки из вашей папки с плагинами, и вы пропускаете некоторые зависимости из папки приложения. – blindmeis

+0

Ваш контейнер должен иметь экспорт ICoupon и экспорт IWallet! – blindmeis

1

Если у вас нет необходимости в бизнесе, я не понял, что вам не нужно, чтобы CouponManager имел свой собственный CompositionContainer и для этого составлял его детали.

Когда вы звоните

_couponManager = _container.GetExportedValue<ICoupon>(); 

Это составит экземпляр вашего купона менеджера. При этом он будет автоматически составлять весь свой импорт (в данном случае, ваш IWallet), а затем рекурсивно составлять все их дочерние импорты.

Таким образом, если IWallet также импорт, они также будут состоять в первоначальном вызове

_couponManager = _container.GetExportedValue<ICoupon>(); 

Так что, если вам не нужно иметь отдельный контейнер для вашего кошелька, я бы удалить контейнер в CouponManager и удалите композицию в ее контейнере.

Затем я попробую еще раз проверить, устраняет ли это ваше исключение.

+0

я изменить мой код относительно вашего предложения, но я все еще получаю такое же исключение. Есть ли у вас какие-либо другие идеи? – anilca

Смежные вопросы