Уеб API с Ninject конструктор без параметри

Гледах урок от 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)"}}

person sam    schedule 20.03.2015    source източник


Отговори (3)


Имах същия проблем, след като актуализирах моите Nuget пакети. Ninject.Web.WebApi версия 3.2.4 въведе критична промяна, която изисква инсталиране на пакет "Ninject.Web.WebApi.WebHost" според бележки по изданието.

След инсталирането на споменатия пакет моите контролери започнаха отново да разрешават зависимостите.

person Pablo Estevez    schedule 31.03.2015
comment
направи това, но все още получава тази грешка в InjectInitializer.cs Без претоварване за метода 'GetControllerTypes' приема 0 аргумента на този ред: foreach (var controllerType в typeResolver.GetControllerTypes()) { container.Register(controllerType); } - person sam; 15.04.2015
comment
Работи и за мен - person Stan Bashtavenko; 09.10.2015

Аз също се натъкнах на този проблем. Има пакетите 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" />

You also have to make sure that you have the start up methods in Application_Stat() in your Global.asax in the right order. Mine looks like this:

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

Можете да получите тази грешка по няколко различни причини, но общият основен проблем обикновено е, че сте пропуснали нещо в настройката на Ninject, за да бъде преобразувател на зависимости за вашите контролери.

В моя случай цялата настройка на Ninject беше извикана от класа Startup.cs. Оказа се, че всичко е наред, просто ми липсваше пакетът Microsoft.Owin.Host.SystemWeb от моя проект, така че кодът Startup всъщност никога не беше извикан. да!

person ngm    schedule 23.06.2016