2011-11-02 48 views
11

我使用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) 
{ 
} 

回答

10

第一。通常,接口是消費者與實現之間的契約。所以如果消費者期望不同的東西,那麼你可能會考慮定義不同的接口。

如果您決定使用相同的界面,則必須使用條件綁定。請參閱有關如何做到這一點的文檔:

https://github.com/ninject/ninject/wiki/Contextual-Binding

https://github.com/ninject/ninject/wiki/Conventions-Based-Binding

+0

感謝聖雷莫。它們實際上是抽象工廠的不同實現,它們在UI中創建Tabs,因此它們做同樣的事情......僅僅是出於不同的原因。 – Stimul8d

+1

我認爲你沒有正確理解。從消費者的角度來看,他們不是一回事。界面應該從消費者的角度來定義。例如。如果你有一個工廠接口'水果CreateFruit()'和消費者期待兩種實現一個香蕉,一個橙子,那麼你應該更好地定義接口'香蕉CreateBanana()'和'橙色CreateOrange()'即使你需要他們只是作爲水果。 –

+0

我明白了。你建議我使用工廠方法,而不是一個抽象工廠用混凝土工廠類。這是一個選項,但工廠類本身有依賴(在這種情況下,子屏幕),它需要注入。這些依賴更容易解決與具體工廠和構造函數注入,而不是工廠方法不是他們還是沒有Ninject有一些其他的魔術我失蹤? – Stimul8d