Использование Ninject с помощью Asp.NET Web API Beta ApiController

Я застрял. Я использовал метод, описанный здесь для wcf web api p6 Ninject, работающий с веб-API WCF Preview 5, однако в бета-версии реализована реализация mvc в бета-версии. Здесь есть хорошая статья http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver, в которой говорится о создании собственного пользовательского преобразователя зависимостей, однако я бы хотел использовать ту же реализацию я ' m для моих контроллеров просмотра mvc... например Ninject. Я пробовал несколько вещей, основанных на примере IoC Unity в этой статье, но пока ничего не вышло. Любая помощь, указывающая на меня в правильном направлении, была бы очень признательна. Я тоже буду рыть самостоятельно. Спасибо заранее!

Здесь, где я нахожусь. Я использовал WebActivator для загрузки кода, но с тех пор я отбросил его в Application_Start(), чтобы извлечь еще одну вещь из уравнения.

    protected void Application_Start()
    {
        var kernel = new StandardKernel(new MyNinjectModule());
        GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(kernel));
    }

И я получаю следующую ошибку:
Тип Ninject.Web.Mvc.NinjectDependencyResolver, похоже, не реализует Microsoft.Practices.ServiceLocation.IServiceLocator.
Имя параметра: commonServiceLocator

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

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.AppStart.ApiBootstrapper), "Start")]
namespace MyApp.AppStart
{
    public class ApiBootstrapper
    {
        public static void Start()
        {
            var kernel = new StandardKernel(new MyNinjectModule());
            var resolver = new NinjectDependencyResolver(kernel);
            GlobalConfiguration.Configuration.ServiceResolver.SetResolver(resolver.GetService, resolver.GetServices);
            GlobalConfiguration.Configuration.MessageHandlers.Add(new ApiAuthHandler());
        }
    }
}

Ответ 2

Я нашел ответ и обновил свой вопрос выше с помощью решения. Само решение было более или менее представлено в в статье, посвященной использованию API-интерфейсов Web API, мне просто нужно было настроить настройки для ninject. Оба ответа помогли мне быстро сузить это, благодаря @Remo и @James.

Ответ 3

Может показаться глупым, но вы убедились, что у вас есть ссылка на пакет NortelServiceLocator/CommonServiceLocator.NinjectAdapter или связанные сборки. Ваш NinjectDependencyResolver, возможно, не сможет решить ссылку на IServiceLocator.

Ответ 4

Тот же код будет работать как для MVC, так и для WebApi, однако, поскольку WebApi был вдохновлен MVC, а сборки MVC не нужно ссылаться для использования WebApi (или наоборот), существует достаточное количество дублирование кода между двумя структурами. Если вы хотите использовать MVC, вы зависите от System.Web.Mvc, если вы хотите использовать WebApi, вы будете использовать System.Web.Http. Если вы хотите использовать оба варианта, вам придется различать код, который будет использоваться, если использовать более явное разрешение пространства имен.

В вашем случае ваша проблема заключается в том, что MVC появился первым, а класс NinjectDependancyResolver наследуется от System.Web.Mvc.IDependencyResolver. Вы хотите создать точный дубликат класса NinjectDependancyResolver и вместо этого наследовать от System.Web.Http.IDependencyResolver. Используйте этот класс для настройки IoC, и вам будет хорошо идти.

Ответ 5

Я нашел хорошее решение здесь.

Это довольно легко, если вы уже используете Ninject CommonServiceLocator/Bootstrapper:

private static IKernel CreateKernel() {
   var kernel = new StandardKernel();
   RegisterServices(kernel);

   GlobalConfiguration.Configuration.ServiceResolver
      .SetResolver(new NinjectServiceLocator(kernel));
   return kernel; 
}