使用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应用程序中,并毫无问题地使用它。
除了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中删除容器,并删除其容器中的组成部分。
然后我会再试一次,看看这是否能解决您的异常。