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



我有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)

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

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

换句话说,除非控制器不能被NInject正确解析,否则它根本不会调用Activator.CreateInstance

换句话说,您应该停止在控制器中寻找问题,并开始检查NInject注册。最简单的第一步是创建一个带有默认构造函数的愚蠢的控制器,在构造函数中设置一个断点,然后查看堆栈跟踪是否反映构造函数正在被NInject调用。

从上面的Joachim身上吸取教训:

仅仅定义ninectcontrollerfactory是不够的,你还必须确保在global.asax.cs

中注册了控制器。

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

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

验证被注入的类是抽象的。此类型的类不能实例化。

相关内容

最新更新