40

私は次の(単純化された)状況にあります:私は2つのインターフェースを持っています

interface IAmAnInterface
{
    void DoSomething();
}

interface IAmAnInterfaceToo
{
    void DoSomethingElse();
}

および両方を実装するクラス:

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

    public void DoSomething()
    {
    }

    public void DoSomethingElse()
    {
    }
}

次に、Ninjectを使用して同じクラスを両方のインターフェイスにバインドします。同じビーイングのインスタンスを使用したいので、ある種のシングルトンが必要なことは明らかです。ninject.extensions.namedscopeを試してみましたが、成功しませんでした。私の最後の試みは:IAmAnImplementationIAmAnInterfaceIAmAnInterfaceTooInScope()

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にIAmAnImplementationforIAmAnInterfaceと同じインスタンスを使用するように指示する方法はありますIAmAnInterfaceTooか?

4

1 に答える 1

106

V3.0.0の使用は非常に簡単です

Bind<I1, I2, I3>().To<Impl>().InSingletonScope();
于 2012-04-18T09:32:45.660 に答える