2015-05-25 85 views
1

這是我的情況: 我有一個非常簡單的MVC4應用程序。一種觀點,一名管制員,責任有限。它的功能是作爲一個供應商的應用程序的登錄頁面,並負責:ASP.Net MVC4使用Ninject,HttpPost返回'無參數構造函數'

  1. 讀取用戶
  2. 從供應商應用程序的數據庫讀取用戶的成員資格的ActiveDirectory性能
  3. 如果會員用戶不不存在的,通過添加用戶確認會員條目,然後重定向到供應商的應用程序
  4. 如果會員不存在,顯示的鏈接,允許用戶通過點擊向供應商申請

我遇到了#3的問題,但只是因爲我已經將Ninject添加到項目中(需要依賴注入來允許單元測試寫入)。從那以後,我爲HTTP Post控制器動作獲取了「爲該對象定義的無參數構造函數」,並且只有後。 GET在這個控制器上工作得很好。這個控制器只有一個構造函數,並且它成功調用GET或POST - 添加一個斷點,我可以逐步調用構造函數,並且只有在傳遞最後一個大括號之後,纔會獲得「無參數構造函數」錯誤。

我試過的解決方案在這些StackOverflow的答案: https://stackoverflow.com/a/14027722/1139007

https://stackoverflow.com/a/17909609/1139007

https://stackoverflow.com/a/21010851/1139007

我已確保我的所有綁定都在NinjectWebCommon.cs(他們是)正確設置。我已驗證(根據this answer)Web.Config具有正確的配置。我已經卸載並重新安裝Ninject.MVC3(和所有依賴項)。我正在拉我的頭髮。

這裏的默認構造:

public HomeController(IAlerts alertRepository, IStore storeRepository, IMemberRecord memberRepository, IHTTPUserRequest userRequest, IActiveDirectory ad) 
    { 
     _alertRepository = alertRepository; 
     _storeRepository = storeRepository; 
     _memberRepository = memberRepository; 
     _userRequest = userRequest; 
     _ad = ad; 
    } 

這裏的HttpPost控制器動作:

[HttpPost] 
    public HttpStatusCodeResult InsertMember(AVMemberRecord profile) 
    { 
     bool validStore = _storeRepository.isValidStore(profile.defaultStoreBU); 

     if (validStore) 
     { 
      bool success = _memberRepository.insertMemberRecord(profile); 

      if (success) 
      { 
       return new HttpStatusCodeResult(200); 
      } 
      else 
      { 
       return new HttpStatusCodeResult(500, "Error inserting Member record. Please open a ticket to request access."); 
      } 
     } 
     else 
     { 
      return new HttpStatusCodeResult(500, "Invalid store association for user. Please open a ticket to request access."); 
     } 


    } 

儲存庫分別具有接受IDataAccess的實例作爲一個參數的構造函數:

public StoreRepository(IDataAccess db) 
    { 
     _db = db; 
     stores = db.getStores(); 
    } 

綁定到IDataAccess的DataAccess類只有一個參數的構造函數,並利用web.config文件中有關其連接字符串:

public DataAccess() 
    { 
     this.connectionString = ConfigurationManager.ConnectionStrings["DEV_ConnectionString"].ToString(); 
    } 

在NinjectWebCommon.cs的綁定:

private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<IDataAccess>().To<DataAccess>(); 
     kernel.Bind<IActiveDirectory>().To<ActiveDirectory>(); 
     kernel.Bind<IStore>().To<StoreRepository>(); 
     kernel.Bind<IMemberRecord>().To<MemberRepository>(); 
     kernel.Bind<IAlerts>().To<AlertRepository>(); 
     kernel.Bind<IHTTPUserRequest>().To<HTTPUserRequest>(); 
    } 

任何建議或指導,以什麼我應該尋找在這裏?如果這種情況持續太久,我可能會重構整個項目來摧毀Ninject(不幸的是,會丟失許多單元測試)。

編輯:完整的錯誤被要求在評論中,所以我會在這裏包括。

[MissingMethodException: No parameterless constructor defined for this object.] System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +113 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232 System.Activator.CreateInstance(Type type, Boolean nonPublic) +83 System.Activator.CreateInstance(Type type) +66 System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +183 System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +564 System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +416 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +317 System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +117 System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) +446 System.Web.Mvc.Async.WrappedAsyncResult1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +302 System.Web.Mvc.&lt;&gt;c__DisplayClass1d.&lt;BeginExecuteCore&gt;b__17(AsyncCallback asyncCallback, Object asyncState) +30 System.Web.Mvc.Async.WrappedAsyncResult1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +381 System.Web.Mvc.Async.WrappedAsyncResult1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +317 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +15 System.Web.Mvc.&lt;&gt;c__DisplayClass8.&lt;BeginProcessRequest&gt;b__2(AsyncCallback asyncCallback, Object asyncState) +71 System.Web.Mvc.Async.WrappedAsyncResult1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +249 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +49 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

+0

可以請你發佈整個異常:消息,堆棧跟蹤(包括內部異常,如果有的話)。 – BatteryBackupUnit

回答

1

你需要確保所有綁定的具體類有一個構造函數。 在這種情況下,它看起來好像是歹徒將是ActiveDirectory和/或HTTPUserRequest

只需爲每個構造函數添加一個無參數的構造函數,並且應該解決錯誤。即:當有一個具體的類沒有構造,所以這種情況並不少見

public class ActiveDirectory : IActiveDirectory 
{ 
    public ActiveDirectory() {} 
    .... 

} 

大部分(如果不是全部)DI發動機將拋出此異常。

更新

Ninject是不是在這種情況下問題,下面亮點AVMemberRecord的罪魁禍首類,它被用作對Post行動paramater @ ascary的意見。在這種情況下拋出異常,因爲Model Binder找不到無參構造函數來實例化類型。

+0

對於ninject,情況並非如此。 – BatteryBackupUnit

+0

同樣,這些類都是爲Index控制器動作和POST動作(InsertMember)實例化的,但錯誤只發生在POST上。 – ascary

+0

我懷疑是這種情況,但是就像任何好的問題排查工具一樣,我經歷了這些步驟來證明或反駁。這是 - 這絕對讓我感到困惑 - ** AVMemberRecord類**,一個被傳遞到POST的控制器動作,缺少構造函數。謝謝。 – ascary