使用Ninject无参数构造函数的Web API

时间:2015-03-20 01:39:06

标签: ninject asp.net-web-api2

当我遇到这个问题时,我正在看Pluralsight的tutorial: 搜索了这个网站并找到了(Simple Injector Unable to Inject Dependencies in Web API ControllersMake sure that the controller has a parameterless public constructor error)不同的解决方案,但它们也没有用。 使用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)"}}

3 个答案:

答案 0 :(得分:11)

我更新Nuget包后遇到了同样的问题。 Ninject.Web.WebApi版本3.2.4引入了一项重大更改,需要按release notes安装软件包“Ninject.Web.WebApi.WebHost”

安装上述软件包后,我的控制器开始再次解析依赖项。

答案 1 :(得分: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" />

您还必须确保在Global.asax中以正确的顺序拥有Application_Stat()中的启动方法。我看起来像这样:

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

答案 2 :(得分:0)

由于一些不同的原因,您可能会收到此错误,但一般的潜在问题通常是您在Ninject的设置中错过了某些内容作为控制器的依赖项解析器。

就我而言,所有Ninject设置都是从​​Startup.cs类调用的。事实证明它很好,我只是错过了我的项目中的Microsoft.Owin.Host.SystemWeb包,所以Startup代码实际上从未被调用过。卫生署!

相关问题