我有一个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应用程序中并使用它,没有问题。
发布于 2012-01-31 16:12:58
除了Gilles答案之外,您的类应该如下所示
[Export(typeof(ICoupon))]
public class CouponManager : ICoupon
{
private IWallet _iWallet;
[ImportingConstructor]
public CouponManager(IWallet iwallet)
{
this._iWallet= iwallet;
}
}发布于 2012-01-31 00:55:00
除非有一些业务需要,我没有从你的问题中理解,否则CouponManager没有必要拥有它自己的CompositionContainer并组成它的各个部分。
当你调用
_couponManager = _container.GetExportedValue<ICoupon>();它将组成您的优惠券管理器的一个实例。在这样做的同时,它将自动组合它的所有导入(在本例中是您的IWallet),然后递归地组合它们的所有子导入。
因此,如果IWallet也有导入,它们也将在初始调用中组合到
_couponManager = _container.GetExportedValue<ICoupon>();所以,除非你的钱包需要一个单独的容器,否则我会删除CouponManager中的容器,并删除其容器中的组合。
然后,我会再次尝试看看这是否解决了您的异常。
https://stackoverflow.com/questions/9067062
复制相似问题