2013-05-01 71 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