0

我有这个代码。

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

我应该怎么办?

4

2 回答 2

0

您应该避免像这样重新绑定。

依赖注入容器应该将注册(声明绑定)与解析(获取对象)分开。

如果您需要几个实现接口的对象,那么使用返回该列表的方法实现一个类,并使该类成为该类的依赖项而不是需要这些对象是要走的路。

于 2013-05-01T21:40:51.157 回答
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

于 2013-05-02T08:34:05.423 回答