Вопрос по ninject, dependency-injection, c# – Можно ли привязать разные интерфейсы к одному и тому же экземпляру класса, реализующего все из них?

36

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

<code>interface IAmAnInterface
{
    void DoSomething();
}
</code>

а также

<code>interface IAmAnInterfaceToo
{
    void DoSomethingElse();
}
</code>

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

<code>class IAmAnImplementation: IAmAnInterface, IAmAnInterfaceToo
{
    public IAmAnImplementation()
    {
    }

    public void DoSomething()
    {
    }

    public void DoSomethingElse()
    {
    }
}
</code>

Теперь я связываю один и тот же класс с обоими интерфейсами, используя Ninject. Так как я хочуsame instance изIAmAnImplementation быть использованным дляIAmAnInterface так же какIAmAnInterfaceToo Понятно, что мне нужен какой-то синглтон. Я играл сninject.extensions.namedscope так же какInScope() но не имели успеха. Моя последняя попытка была:

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

Но, к сожалению, когда я запрашиваю экземпляр моего тестового класса черезkernel.Get<IDependOnBothInterfaces>(); он на самом деле использует разные случаиIAmAnImplementation.

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

Есть ли способ сказать Ninject использовать тот же экземплярIAmAnImplementation заIAmAnInterface так же какIAmAnInterfaceToo?

связанные: см.this V2-era question за слишком подробные обсуждения старых неверных подходов Ruben Bartelink

Ваш Ответ

1   ответ
98

Bind<I1, I2, I3>().To<Impl>().InSingletonScope();
Если у вас более 4 интерфейсов:Bind(I1, I2, I3, I4, I5).To<Impl>().InSingletonScope();
Не могли бы вы объяснить, как это должно быть интегрировано с приведенным выше сценарием?
Это хорошо, когда вы знаете все свои интерфейсы во время компиляции, но не так много, когда вам нужно сканировать их во время выполнения.
+1 Я не знал об этом в 3.0 :) очень приятно знать.
+1 спасибо. Фактически я использую 3.0, поэтому я пойду к этому решению. Silas

Похожие вопросы