我有一个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应用程序并使用它没有问题。
答案 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;
}
}