0

我有同样问题的 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)
4

3 回答 3

0

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

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

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

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

于 2013-06-12T11:37:17.303 回答
0

背负上面的约阿希姆:

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

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

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
于 2013-09-04T19:39:54.560 回答
0

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

于 2013-11-28T19:39:26.610 回答