Привязка одного класса к нескольким интерфейсам как синглтона - PullRequest
18 голосов
/ 16 ноября 2010

У меня есть, например, 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?

Ответы [ 4 ]

20 голосов
/ 16 ноября 2010

С Ninject вы можете сделать это:

var impl = new Impl();
container.Bind<IInt1>().ToMethod(c => impl);
container.Bind<IInt2>().ToMethod(c => impl);

Если у класса Impl есть зависимости, которые вы не можете внедрить для инъекции, вы можете сделать это:

container.Bind<Impl>().ToSelf().InSingletonScope();
container.Bind<IInt1>().ToMethod(c => c.Kernel.Get<Impl>());
container.Bind<IInt2>().ToMethod(c => c.Kernel.Get<Impl>()); 

Красиво и чисто.

5 голосов
/ 17 ноября 2010

Кажется, вы все еще используете 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 голосов
/ 24 марта 2015

Вот как это можно сделать в одной строке кода:

Bind<IInterface1 ,IInterface2 ,ImplClass>().To<ImplClass>().InSingletonScope();

https://github.com/ninject/Ninject.Extensions.ContextPreservation/wiki/BindInterfaceToBinding

Требуется Ninject версии 3.

1 голос
/ 16 ноября 2010

Я подозреваю, что это создаст два экземпляра.

Попробуйте, подойдет ли вам следующая конструкция:

public class ImplClass : IInterface1, IInterface2
{
    public static readonly ImplClass Instance = new ImplClass();
}

Со следующим переплетом:

Bind<IInterface1>().ToMethod(c => ImplClass.Instance);
Bind<IInterface2>().ToMethod(c => ImplClass.Instance);
...