使用mef2注入包含注入模块的模块

时间:2012-01-30 16:19:48

标签: c# design-patterns dependency-injection windows-services mef

我有一个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 个答案:

答案 0 :(得分:1)

除非有一些业务需求我没有理解你的问题,否则CouponManager不需要拥有它自己的CompositionContainer并且它可以组成它的部分。

致电时

_couponManager = _container.GetExportedValue<ICoupon>();

它将组成您的优惠券经理的实例。在这样做的同时,它将自动组成它的所有导入(在这种情况下,你的IWallet),然后递归地组成它们的所有子导入。

因此,如果IWallet也有导入,它们也将在初始调用

中组成
_couponManager = _container.GetExportedValue<ICoupon>();

因此,除非您需要为您的钱包设置一个单独的容器,否则我将删除CouponManager中的容器并删除其容器中的组合。

然后我会再试一次,看看是否可以解决你的异常。

答案 1 :(得分:1)

除了吉尔斯之外,您的课程应该看起来像这样

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

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