Можно ли привязать разные интерфейсы к одному и тому же экземпляру класса, реализуя все из них?
У меня следующая (упрощенная) ситуация: у меня два интерфейса
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();