我使用Ninject 2.0處理DI在我的應用程序之一,我已經遇到東西是困惑我。沒有文檔也沒有太大的幫助,說實話。注入多個相同類型的構造函數的參數與Ninject 2.0
說我有一個簽名構造 -
ctor(IServiceFactory factory1, IServiceFactory factory2)
{
this.factory1 = factory1;
this.factory2 = factory2;
}
雖然這兩個服務實現相同的接口,它們是完全不同的實現,並在不同的時間使用,所以我不希望注入的IEnumerable<IServiceFactory>
。
我的問題是,當我綁定實例時,我該如何告訴Ninject要爲每個實例注入什麼?
在此先感謝。
更新
對於任何人希望看到代碼的緣故閱讀雷莫的鏈接後,將結束,...這是短暫的。 (我從來不知道C#有參數屬性!)你要問自己,如果使用相同的接口是否正確,如果實現需要做完全不同的事情
//abstract factory
public interface IServiceFactory
{
Service Create();
}
//concrete factories
public class Service1Factory : IServiceFactory
{
public IService Create()
{
return new Service1();
}
}
public class Service2Factory : IServiceFactory
{
public IService Create()
{
return new Service2();
}
}
//Binding Module (in composition root)
public class ServiceFactoryModule : NinjectModule
{
public override void Load()
{
Bind<IServiceFactory>()
.To<Service1Factory>()
.Named("Service1");
Bind<IServiceFactory>()
.To<Service2Factory>()
.Named("Service2");
}
}
//consumer of bindings
public class Consumer(
[Named("Service1")] service1Factory,
[Named("Service2")] service2Factory)
{
}
感謝聖雷莫。它們實際上是抽象工廠的不同實現,它們在UI中創建Tabs,因此它們做同樣的事情......僅僅是出於不同的原因。 – Stimul8d
我認爲你沒有正確理解。從消費者的角度來看,他們不是一回事。界面應該從消費者的角度來定義。例如。如果你有一個工廠接口'水果CreateFruit()'和消費者期待兩種實現一個香蕉,一個橙子,那麼你應該更好地定義接口'香蕉CreateBanana()'和'橙色CreateOrange()'即使你需要他們只是作爲水果。 –
我明白了。你建議我使用工廠方法,而不是一個抽象工廠用混凝土工廠類。這是一個選項,但工廠類本身有依賴(在這種情況下,子屏幕),它需要注入。這些依賴更容易解決與具體工廠和構造函數注入,而不是工廠方法不是他們還是沒有Ninject有一些其他的魔術我失蹤? – Stimul8d