Можно ли привязать разные интерфейсы к одному и тому же экземпляру класса, реализуя все из них?

У меня следующая (упрощенная) ситуация: у меня два интерфейса

interface IAmAnInterface
{
    void DoSomething();
}

а также

interface IAmAnInterfaceToo
{
    void DoSomethingElse();
}

и класс, реализующий оба:

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

    public void DoSomething()
    {
    }

    public void DoSomethingElse()
    {
    }
}

Теперь я связываю один и тот же класс с обоими интерфейсами, используя Ninject. Так как я хочу такой же экземпляр IAmAnImplementation быть использованным для IAmAnInterface так же как IAmAnInterfaceToo Понятно, что мне нужен какой-то синглтон. Я играл с https://github.com/ninject/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?

1 ответ

Решение

Это очень легко, используя V3.0.0

Bind<I1, I2, I3>().To<Impl>().InSingletonScope();
Другие вопросы по тегам