Ninject避免使用命名绑定

时间:2013-05-01 18:09:30

标签: c# dependency-injection ninject

我有这段代码。

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”字符串参数,应该使用命名绑定设备解析。

我该怎么办?

2 个答案:

答案 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