Подтвердить что ты не робот

Ошибка конструктора без параметров с привязками Ninject в .NET Web Api 2.1

Работа в настоящее время по написанию сайта API (.NET Web Api 2.1)

Для наших предыдущих сайтов API мы использовали пакет Ninject.MVC3 и вручную подключили преобразователь и область зависимостей и подключили нашу логику к NinjectWebCommon в соответствии с рекомендацией.

Это вызвало изжогу в нашем новом проекте с ошибкой конструктора без параметров. Раньше это было мертвым, что мы не собирались правильно подключать преобразователь зависимостей в Web Api. Только на этот раз мы были. Он был там.

var resolver = new NinjectDependencyResolver(kernel);
GlobalConfiguration.Configuration.DependencyResolver = resolver;

Так что я был немного потерян. На прошлой неделе я увидел, что Ninject был обновлен, пакет nuget WebAPI был восстановлен, поэтому я решил попробовать и реализовать.

Я установил пакет NuGet Ninject.Web.WebApi(версия 3.2). По-видимому, это не включает файл NinectWebCommon.cs для применения привязок. Он только добавил необходимые сборки. Выполняя некоторые копания, я наткнулся на эту реализацию.

https://gist.github.com/odytrice/5842010

(Я не был уверен, что пакет Nuget делает это для меня, и это все избыточный код. Если это так, мне просто нужно понять, как добавить наши привязки с пакетом nuget.)

Я реализовал эту строку для строки, за исключением случаев, когда загружаю модули, я загрузил три наших отдельных модуля в качестве теста.

public static INinjectModule[] Modules
{
    //get { return new INinjectModule[] { new MainModule() }; }
    get { return new INinjectModule[] { new GlobalModule(), new InventoryModule(), new StoreModule() }; }
    }

Я проверил, что с этим новым кодом устанавливается этот преобразователь зависимости.

_resolver = new NinjectHttpResolver(modules);
GlobalConfiguration.Configuration.DependencyResolver = _resolver;

Но все же проблема сохраняется.

ExceptionMessage:

An error occurred when trying to create a controller of type 'StoreSearchController'.
Make sure that the controller has a parameterless public constructor.

StackTrace:

at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()

Внутренний исключение Тип исключения: System.ArgumentException

StackTrace:

at System.Linq.Expressions.Expression.New(Type type) 
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)

Я в недоумении. Я видел много сообщений о необходимости устанавливать MVC-зависимый преобразователь, но не думал, что это связано, поскольку в этом случае у нас нет контроллеров MVC вне домашнего контроллера, который не использует Ninject.

Еще один лакомый кусочек, который может или не имеет значения. Мы используем маршрутизацию атрибутов.

Любая помощь приветствуется.

4b9b3361

Ответ 1

Вам нужно установить один из пакетов хостинга:

  • Ninject.Web.WebApi.WebHost
  • Ninject.Web.WebApi.SelfHost
  • Ninject.Web.WebApi.OwinHost

Ответ 2

Кроме того, дважды проверьте, что ваш конструктор является общедоступным. Это легко заметить.