32

我有以下的(簡化)的情況:我有兩個接口是否有可能將不同的接口綁定到實現它們的類的同一個實例?

interface IAmAnInterface 
{ 
    void DoSomething(); 
} 

interface IAmAnInterfaceToo 
{ 
    void DoSomethingElse(); 
} 

和類實現兩個:

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

    public void DoSomething() 
    { 
    } 

    public void DoSomethingElse() 
    { 
    } 
} 

現在我同班綁定兩個接口都使用Ninject。因爲我想要相同的實例IAmAnImplementation beeing用於IAmAnInterface以及IAmAnInterfaceToo很明顯,我需要某種單身人士。我玩了ninject.extensions.namedscope以及InScope(),但沒有成功。我最後的嘗試是:

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

但不幸的是,當我其實通過kernel.Get<IDependOnBothInterfaces>();要求我的測試類的實例,它使用的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 
    } 
} 

有沒有辦法告訴Ninject使用的IAmAnImplementation相同的實例爲IAmAnInterface以及IAmAnInterfaceToo

+0

相關:參見[這V2時代的問題(http://stackoverflow.com/questions/3147996/binding-singleton-to-multiple-services -in-ninject)對舊的無效方法進行過於詳細的討論 – 2012-11-30 11:23:13

回答

88

它使用V3.0.0很容易

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

+1我沒有意識到這在3.0中:)非常好知道。 – 2012-04-18 09:34:50

+0

+1謝謝。事實上,我使用3.0,所以我會去這個解決方案。 – Silas 2012-04-18 09:48:03

+6

如果你有超過4個接口:'綁定(I1,I2,I3,I4,I5)。到().InSingletonScope();' – Jerome 2015-01-05 17:53:22

相關問題