Использование Ninject с Asp.NET Web API Beta ApiController - PullRequest
11 голосов
/ 23 февраля 2012

Я застрял.Я использовал описанный здесь метод для wcf web api p6 Ninject, работающий с WCF Web API Preview 5 , однако с реализацией mvc в бета-версии все несколько иначе.Здесь есть хорошая статья http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver, в которой рассказывается о создании собственного настраиваемого преобразователя зависимостей, однако я хотел бы использовать ту же реализацию, которую использую для своих контроллеров представления 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());
        }
    }
}

Ответы [ 5 ]

3 голосов
/ 23 февраля 2012

Я никогда не использовал WebAPI, но поскольку семантика IDependencyResolver точно такая же, как и у MVC3, вы должны иметь возможность использовать ту же реализацию: https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/NinjectDependencyResolver.cs

Обновление: Ninject.Web.Расширение WebAPi добавляет поддержку ApiControllers

1 голос
/ 24 февраля 2012

Я нашел ответ и обновил мой вопрос выше решением.Само решение было более или менее представлено в статье «Использование зависимости API Web API Dependency Resolver », мне просто нужно было доработать ее.Оба ответа помогли мне быстро сузить это, так что благодаря @Remo и @ James.

0 голосов
/ 30 марта 2012

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

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

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

   GlobalConfiguration.Configuration.ServiceResolver
      .SetResolver(new NinjectServiceLocator(kernel));
   return kernel; 
}
0 голосов
/ 25 февраля 2012

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

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

0 голосов
/ 23 февраля 2012

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

...