【问题标题】:Ninject "No parameterless constructor defined for this object."Ninject“没有为此对象定义无参数构造函数。”
【发布时间】:2013-11-21 17:29:32
【问题描述】:

我正在测试 Ninject,但是按照操作方法,我发现它无法正常工作。网上的信息乱七八糟,甚至自相矛盾。我正在 Visual Studio 2012 上的 MVC 4 中开发一个网站,我确实使用 Nuget 安装了 Ninject。

所以我得到一个错误:“没有为此对象定义无参数构造函数。”。一旦我进入我的控制器。

我做了必要的步骤:

  • Nuget 安装
  • 在 NinjectWebCommon.cs 中,我确实在 RegisterServices 方法中注册了我的接口。
  • 在我的家庭控制器中,我这样设置我的对象:

    public  ISurvey _survey { get; set; }
    
    [Inject]
    public HomeController(ISurvey s)
    {
        _survey = s;
    }
    

我收到以下错误消息:

“/”应用程序中的服务器错误。

没有为此对象定义无参数构造函数。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.MissingMethodException:没有为此对象定义无参数构造函数。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:


[MissingMethodException:没有为此对象定义无参数构造函数。]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型,Boolean publicOnly,Boolean noCheck,Boolean& canBeCached,RuntimeMethodHandleInternal& ctor,Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(布尔 publicOnly,布尔 skipCheckThis,布尔填充缓存,StackCrawlMark 和 stackMark)+113
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232
   System.Activator.CreateInstance(类型类型,布尔非公共)+83
   System.Activator.CreateInstance(类型类型)+6
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +110

[InvalidOperationException:尝试创建类型为“Surveys.Controllers.HomeController”的控制器时发生错误。确保控制器有一个无参数的公共构造函数。]
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +247
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +438
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +226
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& 控制器, IControllerFactory& 工厂) +326
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback 回调, 对象状态) +177
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback 回调, 对象状态) +88
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +50
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

所以我想知道我做错了什么? 4 小时后,我发现我的 web.config 文件可能有问题,或者可能是缺少引用,或者可能是工厂丢失。现在我什至不知道该怎么办。感谢您的帮助。

【问题讨论】:

  • 可以添加NinjectWebCommon.cs的内容吗?
  • 可以添加ISurvey实现的内容吗?顺便说一句,您不需要使用 Inject 属性装饰构造函数,但我认为这对您的问题没有任何影响。

标签: ninject ninject.web.mvc


【解决方案1】:

您还必须安装 Ninject.MVC3 (https://www.nuget.org/packages/Ninject.MVC3/),其中包括 Ninject 控制器工厂,负责实例化控制器并将正确的依赖项注入控制器构造函数。我几乎可以肯定,如果你通过 Nuget 安装 Ninject.MVC3,一切都会自动配置。

没有这个包,MVC 使用它的默认控制器工厂,它对注入依赖一无所知。

【讨论】:

    【解决方案2】:

    检查您的 Web.config 中是否有两行用于 MVC 版本控制,我有类似的内容:

     <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="4.0.0.0-4.0.0.1" newVersion="4.0.0.1" />
     </dependentAssembly>
    

    如果你这样做了,那么用一行替换它们,以重定向到你在我的情况下使用的最高版本,它是4.0.0.1

      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.0.0.1" />
      </dependentAssembly>
    

    这是为我做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2016-04-25
      • 2018-02-11
      相关资源
      最近更新 更多