Веб-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 in 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