2011-11-02 14 views
11

Estoy usando Ninject 2.0 para manejar DI en una de mis aplicaciones y he encontrado algo que me confunde. Tener cero documentación tampoco ayuda demasiado para ser honesto.Inyectando múltiples parámetros de constructor del mismo tipo con Ninject 2.0

Decir que tengo un constructor con la firma -

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

Aunque estos dos servicios implementar la misma interfaz, que son muy diferentes implementaciones y se utilizan en diferentes momentos por lo que no quiero para inyectar un IEnumerable<IServiceFactory> .

Mi pregunta es, cuando estoy vinculando las instancias, ¿cómo le digo a Ninject qué inyectar para cada una?

Gracias de antemano.

actualización

Por el bien de cualquiera que quiera ver el código terminaría después de leer los enlaces de Remo, ... Aquí está en breve. (Nunca se dio cuenta de C# tenía atributos de parámetros!)

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

Respuesta

10

En primer lugar usted tiene que preguntarse si se utiliza la misma interfaz es correcta si las implementaciones tienen que hacer una cosa completamente diferente. Normalmente, la interfaz es el contrato entre el consumidor y la implementación. Entonces, si el consumidor espera cosas diferentes, entonces podría considerar definir diferentes interfaces.

Si decide permanecer con la misma interfaz que tiene que usar enlaces condicionales. Consulte la documentación sobre cómo se hace esto:

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

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

+0

Gracias Remo. En realidad, son implementaciones diferentes de una fábrica abstracta que crean pestañas en la interfaz de usuario por lo que hacen lo mismo, ... solo por diferentes motivos. – Stimul8d

+1

Creo que no entendiste correctamente. Desde el punto de vista del consumidor, no hacen lo mismo. La interfaz debe definirse desde la perspectiva del consumidor. P.ej. si tiene una interfaz de fábrica 'Fruit CreateFruit()' y el consumidor espera dos implementaciones, una para bananas y otra para naranjas, entonces debería definir mejor la interfaz como 'Banana CreateBanana()' y 'Orange CreateOrange()' incluso si necesita ellos solo como frutas. –

+0

Ya veo. Está sugiriendo que use métodos de fábrica en lugar de una fábrica abstracta con clases de fábrica de concreto. Es una opción, pero las propias clases de fábrica tienen dependencias (subpantallas en este caso) que deben ser inyectadas. Esas dependencias son mucho más fáciles de resolver con las fábricas de concreto y la inyección de constructores en lugar de los métodos de fábrica. ¿No es así o Ninject tiene alguna otra magia que me falta? – Stimul8d

Cuestiones relacionadas