我有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)
答案 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)
验证注入的类是否为抽象类。 这种类无法实例化。