2015-03-20 1 views
3

Я наблюдал tutorial от Pluralsight, когда я наткнулся на эту проблему: Искал этот сайт и нашел (Simple Injector Unable to Inject Dependencies in Web API Controllers, Make sure that the controller has a parameterless public constructor error) различные решения, но они не работают либо. Имея ту же проблему, что и при использовании WebApi и Ninject, автор ничего не делал при написании кода, не знаю, почему я столкнулся с этим, хотелось бы, чтобы кто-то объяснил причину вместе с решением (что писать и где писать) , Вот код:Web API с 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)"}} 

ответ

9

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

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

+0

сделать это, но до сих пор получаю эту ошибку в InjectInitializer.cs Нет перегрузки для метода «GetControllerTypes» принимает аргументы 0 \t на этой линии: Еогеасп (вар controllerType в typeResolver.GetControllerTypes()) { container.Register (controllerType); } – sam

+0

Работал и для меня –

0

Я также столкнулся с этой проблемой. Есть пакеты 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); 
} 
0

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

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