Использование 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());
}
}
}
Ответы
Ответ 1
Я никогда не использовал WebAPI, но поскольку семантика IDependencyResolver точно такая же, как у MVC3, вы должны использовать ту же реализацию: https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/NinjectDependencyResolver.cs
Обновление:
Расширение Ninject.Web.WebAPi добавляет поддержку ApiControllers
Ответ 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;
}