32

tengo el siguiente (simplificado) situación: Tengo dos interfaces¿Es posible vincular diferentes interfaces a la misma instancia de una clase que las implementa?

interface IAmAnInterface 
{ 
    void DoSomething(); 
} 

y

interface IAmAnInterfaceToo 
{ 
    void DoSomethingElse(); 
} 

y una clase de aplicación tanto:

class IAmAnImplementation: IAmAnInterface, IAmAnInterfaceToo 
{ 
    public IAmAnImplementation() 
    { 
    } 

    public void DoSomething() 
    { 
    } 

    public void DoSomethingElse() 
    { 
    } 
} 

Ahora obligar a la misma clase de ambas interfaces usan Ninject. Como quiero la misma instancia de IAmAnImplementation siendo utilizada para IAmAnInterface y IAmAnInterfaceToo, está claro que necesito algún tipo de singleton. Jugué con ninject.extensions.namedscope y InScope() pero no tuve éxito. Mi último intento fue:

Bind<IAmAnImplementation>().ToSelf().InSingletonScope(); 
Bind<IAmAnInterface>().To<IAmAnImplementation>().InSingletonScope(); 
Bind<IAmAnInterfaceToo>().To<IAmAnImplementation>().InSingletonScope(); 

Pero por desgracia, cuando solicito una instancia de mi clase de prueba a través de kernel.Get<IDependOnBothInterfaces>(); que, de hecho, utiliza diferentes instancias de IAmAnImplementation.

class IDependOnBothInterfaces 
{ 
    private IAmAnInterface Dependency1 { get; set; } 
    private IAmAnInterfaceToo Dependency2 { get; set; } 

    public IDependOnBothInterfaces(IAmAnInterface i1, IAmAnInterfaceToo i2) 
    { 
     Dependency1 = i1; 
     Dependency2 = i2; 
    } 

    public bool IUseTheSameInstances 
    { 
     get { return Dependency1 == Dependency2; } // returns false 
    } 
} 

¿Hay una manera de Ninject decirle a utilizar la misma instancia de IAmAnImplementation para IAmAnInterface, así como IAmAnInterfaceToo?

+0

relacionados: Ver [esta pregunta V2 de la era] (http://stackoverflow.com/questions/3147996/binding-singleton-to-multiple-services -in-ninject) para discusiones demasiado detalladas de antiguos enfoques inválidos –

Respuesta

88

Es muy fácil de usar V3.0.0

Bind<I1, I2, I3>().To<Impl>().InSingletonScope(); 
+0

+1 No estaba al tanto de esto en 3.0 :) muy bueno saberlo. –

+0

+1 gracias. De hecho, estoy usando 3.0, así que iré por esta solución. – Silas

+6

Si tiene más de 4 interfaces: 'Enlace (I1, I2, I3, I4, I5) .A () .InSingletonScope();' – Jerome

Cuestiones relacionadas