Внедрение модуля, который содержит введенный модуль, используя mef2 - PullRequest
0 голосов
/ 30 января 2012

У меня есть служба Windows, и я внедряю в нее модуль:

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

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

[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 ».»ошибка.Как мне ввести мой модуль?

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

Заранее спасибо,

РедактироватьИнтересная часть: я могу внедрить этот модуль в мое приложение asp.net mvc и использовать его без проблем.

Ответы [ 2 ]

1 голос
/ 31 января 2012

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

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

  [ImportingConstructor]
  public CouponManager(IWallet iwallet)
  {
     this._iWallet= iwallet;
  }
}
1 голос
/ 30 января 2012

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

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

_couponManager = _container.GetExportedValue<ICoupon>();

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

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

_couponManager = _container.GetExportedValue<ICoupon>();

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

Тогда я бы попробовал еще раз проверить, разрешит ли это ваше исключение.

...