2012-10-15 250 views
2

這是一個MVC應用程序,其中控制器需要構造函數中的DataContextCreatorCustomerID。我ControllerFactory樣子:使用Ninject將參數傳遞給控制器​​構造函數

public class NinjectControllerFactory : DefaultControllerFactory 
    { 
     private IKernel ninjectKernel; 

     public NinjectControllerFactory() 
     { 
      ninjectKernel = new StandardKernel(); 
      AddBindings(); 
     } 


     protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
     { 
      if (controllerType == null) 
      { 
       return null; 
      } 
      else 
      { 
       string customerID = requestContext.HttpContext.Session["CustomerID"].ToString(); 
       return (IController)ninjectKernel.Get(controllerType, new IParameter[]{new Parameter("CustomerID", customerID, true)}); 
      } 
     } 

     private void AddBindings() 
     { 
      ninjectKernel.Bind<IDataContextCreator>().To<DefaultDataContextCreator>(); 
     } 
    } 

我收到以下錯誤導航到該頁面即觸發控制器創建時:

Ninject.ActivationException: Error activating int 
No matching bindings are available, and the type is not self-bindable. 
Activation path: 
2) Injection of dependency int into parameter CustomerID of constructor of type MyController 
1) Request for MyController 

上述所有的在Win 7使用MVC3 .NET 4中。 謝謝你的幫助。

回答

6

你爲什麼寫一個自定義控制器工廠?在使用Ninject.MVC3 NuGet包時,這並不常見。更常見的技術是使用安裝此NuGet時自動註冊的自定義依賴項提供程序。

所以這裏的步驟:

  1. 擺脫你的自定義控制器工廠
  2. 安裝Ninject.MVC3 NuGet包的。
  3. 裏面的~/App_Start/NinjectWebCommon.cs文件來配置你的內核

    private static void RegisterServices(IKernel kernel) 
    { 
        kernel 
         .Bind<IDataContextCreator>() 
         .To<DefaultDataContextCreator>(); 
        kernel 
         .Bind<MyController>() 
         .ToSelf() 
         .WithConstructorArgument("customerID", ctx => HttpContext.Current.Session["CustomerID"]); 
    }   
    
+0

謝謝。我確實執行過你的步驟,但是我無法在'NinjectWebCommon'中找到任何中斷點,例如在'Start()'方法中。可以肯定的是,我刪除了'NinjectControllerFactory',安裝了'Ninject.MVC3'並獲得了'App_Start/NinjectWebCommon.cs'文件。然後我編輯了上面的'RegisterServices()'方法 - 但是我得到了同樣的錯誤。然後我發現'NinjectWebCommon'沒有被調用到任何地方? –

+0

當您第一次運行應用程序時,應該調用Start方法。 –

+0

我在哪裏調用'Start()'方法?我首先嚐試在Application_Start()中調用它。這工作,但我得到了異常'InvalidOperationException'穿過本機/管理的邊界 此方法只能在應用程序的預啓動初始化階段調用。 我接下來意識到我可能需要一個'NinjectHttpApplication'。所以我做了如[鏈接](https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-application)所示的設置。在這裏我得到的例外:'System.InvalidOperationException':序列不包含任何元素 –