32

I mają następujące (uproszczonych) Położenie: mam dwa interfejsyCzy można powiązać różne interfejsy z tym samym wystąpieniem klasy implementującej je wszystkie?

interface IAmAnInterface 
{ 
    void DoSomething(); 
} 

i

interface IAmAnInterfaceToo 
{ 
    void DoSomethingElse(); 
} 

a klasą wykonawczych zarówno:

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

    public void DoSomething() 
    { 
    } 

    public void DoSomethingElse() 
    { 
    } 
} 

Teraz wiążą ten sam klasę oba interfejsy używają programu Ninject. Ponieważ chcę, aby sama instancja z IAmAnImplementation była używana dla IAmAnInterface, a także IAmAnInterfaceToo, jasne jest, że potrzebuję jakiegoś singletonu. Grałem z ninject.extensions.namedscope, a także InScope(), ale nie udało mi się. Moja ostatnia próba była:

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

Ale niestety, kiedy poprosić o wystąpienie mojej klasie testowej poprzez kernel.Get<IDependOnBothInterfaces>(); go w rzeczywistości wykorzystuje różne instancje 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 
    } 
} 

Czy istnieje sposób powiedzieć Ninject używać tej samej instancji IAmAnImplementation dla IAmAnInterface jak również IAmAnInterfaceToo?

+0

powiązane: Patrz [V2-era to pytanie] (http://stackoverflow.com/questions/3147996/binding-singleton-to-multiple-services -in-ninject) dla zbyt szczegółowych dyskusji na temat starych nieważnych podejść. –

Odpowiedz

88

Jest bardzo łatwe przy użyciu V3.0.0

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

+1 Nie wiedziałem o tym w 3.0 :) bardzo dobrze wiedzieć. –

+0

+1 dzięki. W rzeczywistości używam wersji 3.0, więc pójdę po to rozwiązanie. – Silas

+6

Jeśli masz więcej niż 4 interfejsy: 'Bind (I1, I2, I3, I4, I5). Do () .InSingletonScope();' – Jerome

Powiązane problemy