Совместное использование ядра между WebAPI и MVC

У меня есть простой сайт MVC4, который использует ASP.NET webAPI, а также страницы MVC.

Я хотел бы использовать Ninject DI для обоих типов контроллеров, но мне интересно, как это можно сделать?

У меня есть Ninject DI, работающий для WebAPI, но теперь я не уверен, как элегантно использовать одно и то же ядро.

Должен ли я использовать какой-то синглтон ядра, на который могут ссылаться оба преобразователя зависимостей?

У кого-нибудь был опыт с этим?

Ваше здоровье.


person Andrew Duffy    schedule 03.02.2014    source источник


Ответы (2)


Вы должны использовать один и тот же экземпляр IKernel для одного корня композиции уровня приложения, это могут быть контроллеры WebApi или MVC.

Если вы используете пакет Ninject.MVC3:

Когда ядро ​​инициализируется в NinjectWebCommon.cs внутри вашей папки App_Start, у вас уже есть к нему доступ. Для контроллеров MVC вам не нужно ничего делать, чтобы Ninject DI работал.

Но для контроллеров WebAPI вам нужно использовать DependencyResolver для внедрения зависимостей в ваши контроллеры. Используя эту реализацию для этого преобразователя, вы затем устанавливаете его в качестве преобразователя для всех ваших WebAPI контроллеров, таких как это:

  1. Привяжите NinjectDependencyResolver к себе (необязательно), внутри RegisterServices в NinjectWebCommon.cs:

    kernel.Bind<NinjectDependencyResolver>().ToSelf();
    
  2. Установите конфигурацию WepAPI для использования вашего Resolver, обычно внутри WebApiConfig.cs:

    public static void Register(HttpConfiguration config)
    {
        //Other initialization code
        config.DependencyResolver = (new   Bootstrapper()).Kernel.Get<NinjectDependencyResolver>();
    }
    

Это будет соответствовать вашему сценарию для всех контроллеров, использующих один и тот же IKernel.

Надеюсь, это поможет!

person cvbarros    schedule 03.02.2014
comment
У вас есть решение вашей проблемы в связанном вопросе как mvc, так и webapi%23">stackoverflow.com/questions/21158274/ - person Radenko Zec; 10.07.2014

Да ты прав. Для приложения должно быть одно ядро/контейнер, потому что это устранит возможные ошибки в будущем. В случае нескольких ядер вы можете прописать интерфейс в ядре, а затем попытаться разрешить его с помощью другого ядра, и программа вылетит. .Только потратив время на отладку, выясняешь, что было не так и т.д.

Кроме того, при использовании одного ядра вам не придется регистрировать одну и ту же реализацию несколько раз.

person Toan Nguyen    schedule 03.02.2014