2010-02-11 21 views
6

我使用: -如何使用asp.net mvc 2獲得ninject 2.0?

  1. asp.net的MVC RC 2
  2. Ninject和ninject asp.net mvc的擴展名(http://github.com/enkari/ninject.web.mvc

我不斷收到此定義的「無參數的構造函數目的。'爲我的AccountController。 AccountController注入了服務。 ServiceModule中定義了這些服務的綁定。

在Global.asax.cs中查找我的MvcApplication代碼。

public class MvcApplication : NinjectHttpApplication // System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Account", action = "Login", id = "" } // Parameter defaults 
     ); 

    } 

    protected override void OnApplicationStarted() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new INinjectModule[] { 
      new ServiceModule(), 
     }); 
    } 
} 
+0

是工作的其他控制器?您是否針對ASP.NET MVC 2 RC 2構建了Ninject.Web.Mvc項目? – Charlino 2010-02-11 20:57:53

+0

@Charlino。謝謝你的工作。 – 2010-02-12 02:26:23

回答

7

針對ASP.Net MVC 2 dlls重建Ninject.Web.Mvc修復了這個問題。問題出在NinjectControllerFactory類。拿到控制器實例方法的簽名MVC 2

IController GetControllerInstance(Type controllerType) 

已更改爲

IController GetControllerInstance(
     RequestContext requestContext, Type controllerType) 

進行必要的更改和重建Ninject MVC擴展和一切工作正常。感謝@Charlino的建議。

+1

很好聽。毀了我沒有答案,並獲得積分! ;-) – Charlino 2010-02-12 03:22:31

-1

在Ninject中,您不應該重寫Application_Start方法。如果你需要做的事情不是自動完成的(比如註冊區域 - 如果Ninject也爲你做好準備,我不知道如何),一定要致電base.OnApplicationStarted()讓所有Ninject特定的東西運行正常。

protected override void OnApplicationStarted() 
{ 
    base.OnApplicationStarted(); 

    // Kick some butt here 
} 
+0

從我在'NinjectHttpApplication.cs'文件中看到的函數是空的。我同意我應該按照你說的方式去做(因爲它是虛擬的),但是這並不能解決我的問題。 – 2010-02-11 20:47:43

-1

除了'new ServiceModule()'之後的逗號之外,代碼看起來是正確的。

它應該在Global.asax.cs中,而不是Global.aspx.cs。

+0

在問題中編輯文件名。這是一個輸入錯誤。逗號並不重要。它是鍵入語法。 – 2010-02-12 02:20:40

1

因爲什麼原因,我發現如果你的global.asax.cs繼承自NinjectHttpApplication,OnApplicationStarted()不會被調用。改變你的OnApplicationStarted()來覆蓋Init(),它應該工作。

見下文:

public class MvcApplication : NinjectHttpApplication // System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Account", action = "Login", id = "" } // Parameter defaults 
     ); 

    } 

    public override void Init() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new INinjectModule[] { 
      new ServiceModule(), 
     }); 
    } 
}