2011-11-02 22 views
11

Sto usando Ninject 2.0 per gestire DI in una delle mie app e mi sono imbattuto in qualcosa che mi confonde. Avere zero documentazione non aiuta troppo neanche ad essere onesti.Iniezione di più parametri di un costruttore dello stesso tipo con Ninject 2.0

Dice che ho un costruttore con la firma -

ctor(IServiceFactory factory1, IServiceFactory factory2) 
{ 
    this.factory1 = factory1; 
    this.factory2 = factory2; 
} 

Anche se questi due servizi implementano la stessa interfaccia, sono abbastanza diverse implementazioni e sono utilizzati in tempi diversi in modo da non voglio iniettare un IEnumerable<IServiceFactory> .

La mia domanda è: quando lego le istanze, come posso dire a Ninject cosa iniettare per ciascuna?

Grazie in anticipo.

Aggiornamento

Per il bene di tutti coloro che vogliono vedere il codice finirebbe dopo aver letto i collegamenti di Remo, ... Ecco in breve. (Non ho mai capito C# avuto gli attributi dei parametri!)

//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) 
{ 
} 

risposta

10

Prima di tutto è necessario chiedersi se si utilizza la stessa interfaccia è corretta se le implementazioni bisogno di fare una cosa completamente diversa. Normalmente, l'interfaccia è il contratto tra il consumatore e l'implementazione. Quindi, se il consumatore si aspetta cose diverse, si potrebbe prendere in considerazione la possibilità di definire interfacce diverse.

Se si decide di rimanere con la stessa interfaccia di quella che è necessario utilizzare i binding condizionali. Vedere la documentazione su come questo viene fatto:

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

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

+0

Grazie Remo. Sono in realtà diverse implementazioni di una fabbrica astratta che creano schede nell'interfaccia utente in modo che facciano la stessa cosa, ... solo per motivi diversi. – Stimul8d

+1

Penso che tu non abbia capito bene. Dal punto di vista del consumatore non fanno la stessa cosa. L'interfaccia dovrebbe essere definita dal punto di vista del consumatore. Per esempio. se hai un'interfaccia factory 'Fruit CreateFruit()' e il consumatore si aspetta due implementazioni una per le banane e una per le arance, allora dovresti definire meglio l'interfaccia come 'Banana CreateBanana()' e 'Orange CreateOrange()' anche se hai bisogno loro solo come frutti. –

+0

Vedo. Mi stai suggerendo di utilizzare metodi di fabbrica piuttosto che una fabbrica astratta con classi di fabbrica concrete. È un'opzione ma le classi di fabbrica stesse hanno dipendenze (sotto-schermate in questo caso) che devono essere iniettate. Queste dipendenze sono molto più facili da risolvere con le fabbriche concrete e l'iniezione del costruttore, piuttosto che i metodi di produzione, o Ninject non ha forse qualche altra magia che mi manca? – Stimul8d

Problemi correlati