32

私は(簡体字)以下の状況がある:私は2つのインターフェイス異なるインターフェースをすべて実装するクラスの同じインスタンスにバインドすることは可能ですか?

interface IAmAnInterface 
{ 
    void DoSomething(); 
} 

interface IAmAnInterfaceToo 
{ 
    void DoSomethingElse(); 
} 

との両方を実装するクラスがあります

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

    public void DoSomething() 
    { 
    } 

    public void DoSomethingElse() 
    { 
    } 
} 

を今はに同じクラスに結合します両方のインタフェースはNinjectを使用します。 同じインスタンスIAmAnImplementationIAmAnInterfaceIAmAnInterfaceTooと同じように使用したいと思うので、何らかのシングルトンが必要であることは明らかです。私はninject.extensions.namedscopeInScope()と一緒に遊んだが成功しなかった。

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 
    } 
} 

方法IAmAnInterfaceなどIAmAnInterfaceTooためIAmAnImplementationの同じインスタンスを使用するようにNinjectを伝えるはありますか?

+0

関連を使用して非常に簡単です:[このV2時代の質問](http://stackoverflow.com/questions/3147996/binding-singleton-to-multiple-servicesを参照してください。 -in-ninject)古い無効なアプローチの詳細な議論のために –

答えて

88

それはV3.0.0

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

+1私はこれを知っていませんでした3.0:知っているととても良いです。 –

+0

+1ありがとうございます。実際に私は3.0を使用していますので、この解決策を検討します。 – Silas

+6

インターフェイスが4つ以上ある場合: 'Bind(I1、I2、I3、I4、I5).To ().InSingletonScope(); ' – Jerome

関連する問題