首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mef2注入包含注入模块的模块

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

Stack Overflow用户
提问于 2012-01-31 00:19:48
回答 2查看 390关注 0票数 0

我有一个windows服务,我正在给它注入一个模块:

代码语言:javascript
复制
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

但是我尝试导入的模块是一个构造器注入模块:

代码语言:javascript
复制
[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应用程序中并使用它,没有问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-31 16:12:58

除了Gilles答案之外,您的类应该如下所示

代码语言:javascript
复制
[Export(typeof(ICoupon))]
public class CouponManager : ICoupon 
{
  private IWallet _iWallet;

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

Stack Overflow用户

发布于 2012-01-31 00:55:00

除非有一些业务需要,我没有从你的问题中理解,否则CouponManager没有必要拥有它自己的CompositionContainer并组成它的各个部分。

当你调用

代码语言:javascript
复制
_couponManager = _container.GetExportedValue<ICoupon>();

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

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

代码语言:javascript
复制
_couponManager = _container.GetExportedValue<ICoupon>();

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9067062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档