2013-05-01 59 views
0

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

我该怎么办?

+1

你需要让路更多的上下文。你想做什么,为什么。给你一些你想要什么的样本。然后有人可以协助将其表达为Ninject'Bind'语句。现在,你在混合使用'绑定',这绝不是一个好主意,可以随时解决。 – 2013-05-01 19:55:58

+0

我想注册多个实现我的接口名称的类,即使它们是相同的。 例 的iDevice - >为TestDevice名为 “D1” 的iDevice - > VirtualDevice名为 “D2” 的iDevice - > VirtualDevice命名为 “D3” 这样,我想用costructor注射,让他们在我的代码: void ctor([Named(“D3”)] IDevice mydev){} – Vincenzo 2013-05-02 06:03:18

回答

0

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

依赖注入容器应该将注册(声明绑定)从Resolve(获取对象)中分离出来。

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

+0

我没有完全理解你的最后一句。 你能提供一个例子吗?有什么框架可以帮助这项工作? – Vincenzo 2013-05-02 06:04:21

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

+0

我将检查扩展并尝试您的代码。谢谢。 – Vincenzo 2013-05-02 09:15:40

+0

我无法使用您的代码片断,因为绑定应尽快可用。有没有其他的方式来得到这个? – Vincenzo 2013-05-04 11:01:46

+1

@Vincenzo'应该尽快提供'...为了什么?你需要解释这种必要的相互关系,以便有人可以解释一种实现结果的方法。说实话,我仍然不知道你是什么*实际上*尝试去做 - 看起来你已经隐藏了你的实际问题,试图简单地在你的问题中解释它 – 2013-05-04 23:49:20