Связывание одного класса с несколькими интерфейсами как singleton
Я имею, например, 2 интерфазии IInterface1
и IInterface2
,
public interface IInterface1 {...}
public interface IInterface2 {...}
и одна реализация этих интерфейсов ImplClass
.
public class ImplClass : IInterface1, IInterface2 {...}
Я должен быть уверен, что приложение имеет только один экземпляр ImplClass, который будет использоваться как IInterface1 и IInterface2.
Я использую ninject для инъекции зависимостей. Итак, мой вопрос: соответствует ли код ниже моих требований?
...
Bind<IInterface1>().To<ImplClass>().Using<SingletonBehavior>();
Bind<IInterface2>().To<ImplClass>().Using<SingletonBehavior>();
...
Или этот код создаст 2 экземпляра ImplClass для интерфейса eash?
Ответы
Ответ 1
С помощью Ninject вы можете сделать это:
var impl = new Impl();
container.Bind<IInt1>().ToMethod(c => impl);
container.Bind<IInt2>().ToMethod(c => impl);
Когда класс Impl
имеет зависимости, вы не можете вводить Ninject, вы можете сделать это:
container.Bind<Impl>().ToSelf().InSingletonScope();
container.Bind<IInt1>().ToMethod(c => c.Kernel.Get<Impl>());
container.Bind<IInt2>().ToMethod(c => c.Kernel.Get<Impl>());
Приятный и чистый.
Ответ 2
Кажется, что вы все еще используете Ninject 1.5. Я больше не имею в виду точный синтаксис, но он должен быть аналогичен следующему синтаксису 2.1:
kernel.Bind<I1>().ToMethod(ctx => ctx.Kernel.Get<Impl>());
kernel.Bind<I2>().ToMethod(ctx => ctx.Kernel.Get<Impl>());
kernel.Bind<Impl>().ToSelf().InSingletonScope();
Или даже лучше использовать Ninject.Extensions.ContextPreservation, чтобы сохранить контекст.
kernel.Bind<Impl>().ToSelf().InSingletonScope();
kernel.BindInterfaceToBinding<I1, Impl>();
kernel.BindInterfaceToBinding<I2, Impl>();
Ответ 3
Так вы можете сделать это в одной строке кода:
Bind<IInterface1 ,IInterface2 ,ImplClass>().To<ImplClass>().InSingletonScope();
https://github.com/ninject/Ninject.Extensions.ContextPreservation/wiki/BindInterfaceToBinding
Требуется версия Ninject 3.
Ответ 4
Я бы предположил, что это создаст два экземпляра.
Попробуйте создать для вас следующую конструкцию:
public class ImplClass : IInterface1, IInterface2
{
public static readonly ImplClass Instance = new ImplClass();
}
Со следующим связыванием:
Bind<IInterface1>().ToMethod(c => ImplClass.Instance);
Bind<IInterface2>().ToMethod(c => ImplClass.Instance);