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

本文关键字:模块 注入 包含 mef2 使用 | 更新日期: 2023-09-27 18:21:59

我有一个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.CuponManager"的实例时发生异常。"错误。我必须如何注入我的模块?

我不确定我的问题是否清楚,如果不清楚,请询问细节。

提前感谢

编辑:有趣的部分是:我可以将这个模块注入到我的asp.net mvc应用程序中,并毫无问题地使用它。

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

除了Gilles答案外,你的类应该看起来像这个

[Export(typeof(ICoupon))]
public class CouponManager : ICoupon 
{
  private IWallet _iWallet;
  [ImportingConstructor]
  public CouponManager(IWallet iwallet)
  {
     this._iWallet= iwallet;
  }
}

除非有一些业务需求我还没有从你的问题中了解到,否则CouponManager没有必要拥有自己的CompositionContainer,也没有必要组成自己的部分。

当你呼叫时

_couponManager = _container.GetExportedValue<ICoupon>();

它将组成您的优惠券管理器的一个实例。在这样做的过程中,它将自动组成它的所有导入(在本例中,是您的IWallet),然后递归地组成它们的所有子导入。

因此,如果IWallet也有导入,它们也将在对的初始调用中组成

_couponManager = _container.GetExportedValue<ICoupon>();

所以,除非你需要为你的钱包有一个单独的容器,否则我会在CouponManager中删除容器,并删除其容器中的组成部分。

然后我会再试一次,看看这是否能解决您的异常。