2014-01-22 105 views
9

爲什麼我不能在Ninect中執行以下操作?將ninject的多個實現綁定到相同的接口

Kernel.Bind<IPresenter>.To<DefaultPresenter>(); 
Kernel.Bind<IPresenter>.To<DashboardPresenter>(); 
Kernel.Bind<IPresenter>.To<HeartRatePresenter>(); 
Kernel.Bind<IPresenter>.To<GPSPresenter>(); 

這4個實現中的每一個都有一個不同的構造函數,期望不同的類型。當我嘗試這個時,Ninject會拋出一個異常告訴我,我不能多次綁定到同一個接口。

在一類稱爲Presentable所有主持人類繼承,我試圖做Kernel.Get<IPresenter>(new ConstructorArgument("view", this))所以頁面/視圖中分配IPresentable Presenter在頁面/視圖實現了演講者期望作爲參數的接口。

這是什麼方法使ninject識別不同的構造函數參數類型?

回答

5

您需要告訴ninject它應該如何知道要選擇哪個綁定。

看一看條件約束: https://github.com/ninject/ninject/wiki/Contextual-Binding

我會建議使用.When(...)語法,但也許你更喜歡使用名爲綁定(即指定名稱/標識符,每一個綁定並通過該名稱在.Get<IPresenter>("SomeName")到ninject呼叫)。

+0

這個幫助頁面是shiznit!非常好 –

+0

如果請求的類有一個屬性名稱綁定: '綁定()。()。When(request =>(((System.Reflection.PropertyInfo [])((System.Reflection (...)。(...)。(...)((request.Target.Member).ReflectedType))。DeclaredProperties)[0])。Name.Contains(「WhenHasSomePropertyName」));' 最好的用法? – stom

5

您需要使用上下文綁定。我通常使用具體的「目標」類來決定內核將使用.WhenInjectedInto().WhenInjectecExactlyInto()提供的服務實現。

+0

如果目標類具有屬性名稱,則綁定: '將()。綁定到()。類型信息)((request.Target.Member).ReflectedType))。DeclaredProperties)[0])。Name.Contains(「WhenHasSomePropertyName」));' 如何使用'When(...)'什麼是最好的用法可以展示一個例子嗎? – stom

14

綁定到多個接口很好。 Ninject允許這樣做。看到這裏:https://github.com/ninject/Ninject/wiki/Multi-injection

問題是,Ninject不能只是神奇地給你的「一」,你想要取決於構造函數參數。 Ninject設計用來處理你寫的代碼是當你要求列表時,一次給你所有的綁定。

所以和其他人說的一樣,如果你只想要一個實例,聽起來像你想要的是上下文綁定。然而,你問你的問題和其他答案的方式有點令人困惑,因爲它聽起來像多次注入是不可能的,但如果它真的是你想要的,這是可能的。 (在這種情況下,它不是)

相關問題