MVC 3例外:确保控制器具有无参数的公共构造函数

时间:2013-06-12 10:29:11

标签: asp.net-mvc-3 dependency-injection ninject

我有this同样问题的MVC 3应用。我使用Ninject进行依赖注入。我无法追踪哪个控制器有问题,它昨天破了,我花了整整一天试图找到。应用程序中有60多个控制器。无法捕获或调试异常,跟踪也不会为有问题的源控制器提供任何有意义的线索。如果不抛出此异常,则无法访问任何控制器的任何操作。

有谁知道如何确定有问题的实际控制器?

由于

内部例外:

System.MissingMethodException: No parameterless constructor defined for this object.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean
noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)

堆栈追踪:

at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)
at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<BeginProcessRequest>b__2()
at System.Web.Mvc.SecurityUtil.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a()
at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f)
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust[TResult](Func`1 func)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

3 个答案:

答案 0 :(得分:0)

似乎NInject未正确注册以解决任何问题,或者无法解析任何控制器类型。从MVC3的源代码,这是对堆栈跟踪中显示的Activator.CreateInstance的调用;

return (IController)(_resolverThunk().GetService(controllerType) ??
                     Activator.CreateInstance(controllerType));

换句话说,它根本不会调用Activator.CreateInstance,除非NInject无法正确解析控制器。

换句话说,您应该停止在控制器中找到问题,并开始检查NInject注册。最简单的第一步是使用默认构造函数创建一个死的愚蠢控制器,在构造函数中设置断点,并看到堆栈跟踪反映了NInject正在调用构造函数。如果不是,则NInject未正确注册。

答案 1 :(得分:0)

在上面搭载约阿希姆:

定义NInjectControllerFactory是不够的,还必须确保在global.asax.cs中注册控制器

我遇到了同样的问题 - 即Ninject类在Project&gt; Infrastructure&gt; NinjectControllerFactory.cs中定义,但在编译和导航到简单路由时没有遇到任何断点。必须将以下行添加到Application_Start():

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

答案 2 :(得分:0)

验证注入的类是否为抽象类。 这种类无法实例化。