Веб-API с Ninject Parameterless Constructor

75
8

Я смотрел учебник от Pluralsight, когда я столкнулся с этой проблемой:
Искал этот сайт и нашел (Простой инжектор, неспособный вложить зависимости в контроллерах веб-API, Удостоверьтесь, что контроллер имеет безрезультатную публикацию ошибка конструктора) разные решения, но они тоже не работали.
Имея ту же проблему, что и при использовании WebApi и Ninject, автор не писал ничего, написав код, не знаю, почему я столкнулся с этим, был бы рад, если кто-то объяснит причину вместе с решением (что писать и где писать). Здесь код:


//NinjectWebCommon.cs
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IRepository>().To<Repository>().InRequestScope(); //for making singleton
kernel.Bind<WebAPIandEFContext>().To<WebAPIandEFContext>().InRequestScope();

}
//Order Controller
public class OrderController : ApiController
{
private IRepository _repo;

public OrderController(IRepository repo)
{
_repo = repo;
}
//remaining code....
ERROR description
{"$id":"1","Message":"An error has occurred.","ExceptionMessage":"An error

occurred when trying to create a controller of type 'OrderController'. Make sure that the controller has a parameterless public constructor.","ExceptionType":"System.InvalidOperationException","StackTrace":" at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()","InnerException":{"$id":"2","Message":"An error has occurred.","ExceptionMessage":"Type 'WebAPIandEF.Controllers.OrderController' does not have a default constructor","ExceptionType":"System.ArgumentException","StackTrace":" at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}}

спросил(а) 2015-03-20T04:39:00+03:00 5 лет, 2 месяца назад
1
Решение
84

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

В моем случае все настройки Ninject вызывались из класса Startup.cs. Оказывается, все в порядке, мне просто не хватает пакета Microsoft.Owin.Host.SystemWeb из моего проекта, поэтому код Startup никогда не вызывался. Doh!

ответил(а) 2016-06-23T13:43:00+03:00 3 года, 11 месяцев назад
117

У меня была такая же проблема после обновления моих пакетов Nuget. Версия Ninject.Web.WebApi 3.2.4 ввела нарушение, требующее установки пакета "Ninject.Web.WebApi.WebHost" за примечания к выпуску.

После установки указанного пакета мои контроллеры снова начали разрешать зависимости.

ответил(а) 2015-03-31T06:00:00+03:00 5 лет, 2 месяца назад
39

Я также столкнулся с этой проблемой. Есть пакеты Ninject, которые у меня есть, и теперь они работают.


<package id="Ninject" version="3.2.0.0" targetFramework="net451" />
<package id="Ninject.MVC5" version="3.2.1.0" targetFramework="net451" />
<package id="Ninject.Web.Common" version="3.2.0.0" targetFramework="net451" />
<package id="Ninject.Web.Common.WebHost" version="3.2.0.0" targetFramework="net451" />
<package id="Ninject.Web.WebApi" version="3.2.4.0" targetFramework="net451" />


Вы также должны убедиться, что у вас есть методы запуска в Application_Stat() в вашем Global.asax в правильном порядке. Мой выглядит так:


protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}

ответил(а) 2015-05-19T07:18:00+03:00 5 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема