0

これと同じ問題を抱えた MVC 3 アプリがあります。依存性注入には Ninject を使用します。どのコントローラに問題があるのか​​追跡できません。昨日壊れてしまい、その場所を探すのに 1 日を費やしました。アプリケーションには 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

To piggyback off of Joachim above:

Defining the NInjectControllerFactory is not enough, you must also make sure to register the controller in global.asax.cs

I was getting the same issues - i.e. the Ninject class was defined in Project>Infrastructure>NinjectControllerFactory.cs yet no breakpoints were being hit when compiling and navigating to simplistic routes. The following line must be added to Application_Start():

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
于 2013-09-04T19:39:54.560 に答える
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 に答える