我有这段代码。
foreach(device into xmlfile)
{
var kdevice = kernel.Get(type, parameters.ToArray()) as IDevice;
devices.Add(kdevice);
kernel.Bind(type).ToConstant(kdevice).InSingletonScope().Named(kdevice.Name);
if (type.IsSubclassOf(typeof(BaseDevice)))
kernel.Bind<BaseDevice>().ToConstant(kdevice as BaseDevice).InSingletonScope().Named(kdevice.Name);
}
我的问题是,在下一次迭代中,即使我没有要求命名绑定,Kernel.Get也会通过第一次绑定解析,因此它应该创建一个新对象。
我不能使用后期最终绑定,因为其他设备可能有一个“refDevice”字符串参数,应该使用命名绑定设备解析。
我该怎么办?
答案 0 :(得分:0)
你应该避免像这样重新绑定。
依赖注入容器应该将Resiving(声明绑定)与Resolving(获取对象)分开。
如果您需要多个实现接口的对象,那么使用返回该列表的方法实现一个类,并使该类成为该类的依赖项,而不是需要这些对象。
答案 1 :(得分:0)
var devices = xmlFile
.Select( def => kernel.Get(def.Type, def.Parameters.ToArray())
.ToArray();
foreach( var device in devices)
kernel.Bind(device.GetType()).ToConstant(device).Named(device.Name);
foreach( var device in devices.OfType<BaseDevice>())
kernel.Bind<BaseDevice>().ToConstant(device).Named(device.Name);
我认为你也应该看看Ninject.Extensions.Xml