Ответ 1
Вам нужно установить один из пакетов хостинга:
- Ninject.Web.WebApi.WebHost
- Ninject.Web.WebApi.SelfHost
- Ninject.Web.WebApi.OwinHost
Работа в настоящее время по написанию сайта 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.
Еще один лакомый кусочек, который может или не имеет значения. Мы используем маршрутизацию атрибутов.
Любая помощь приветствуется.
Вам нужно установить один из пакетов хостинга:
Кроме того, дважды проверьте, что ваш конструктор является общедоступным. Это легко заметить.