2010-02-11 20 views
6

ich bin mit: -Wie bekomme ich Ninject 2.0 mit asp.net mvc 2 arbeiten?

  1. asp.net Mvc rc 2
  2. Ninject und ninject asp.net MVC-Erweiterung (http://github.com/enkari/ninject.web.mvc)

Ich halte die ‚No parameterlosen Konstruktor für diese definiert immer Objekt.' für meinen AccountController. Dem AccountController werden Dienste hinzugefügt. Die Bindungen für diese Dienste sind im ServiceModule definiert.

Hier finden Sie den Code für meine MvcApplication in Global.asax.cs.

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

arbeiten andere Controller? Haben Sie das Ninject.Web.Mvc-Projekt gegen ASP.NET MVC 2 RC 2 erstellt? – Charlino

+0

@Charlino. Danke, das hat funktioniert. –

Antwort

7

Der Wiederaufbau der Ninject.Web.MVC gegen die ASP.Net MVC 2 DLLs behoben das Problem. Das Problem liegt in der NinjectControllerFactory-Klasse. Die Signatur der Methode der Controller-Instanz erhalten hat in MVC 2.

geändert
IController GetControllerInstance(Type controllerType) 

Um

IController GetControllerInstance(
     RequestContext requestContext, Type controllerType) 

die notwendigen Änderungen vornehmen und die Ninject MVC-Erweiterung wieder aufbauen und alles funktioniert gut. Danke an @Charlino für den Vorschlag.

+1

Gut zu hören. Ausgenommen habe ich es keine Antwort gegeben und die Punkte bekommen! ;-) – Charlino

-1

In Ninject sollten Sie die Application_Start-Methode nicht überschreiben. Wenn du Dinge brauchst, die nicht automatisch funktionieren (wie das Registrieren von Bereichen - ich weiß nicht, ob Ninject das auch für dich tut), rufe unbedingt base.OnApplicationStarted() an, um alle Ninject-spezifischen Sachen laufen zu lassen richtig.

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

    // Kick some butt here 
} 
+0

Von was ich in der 'NinjectHttpApplication.cs' Datei sehe, ist die Funktion leer. Ich stimme zu, dass ich es so machen sollte, wie du es gesagt hast (weil es virtuell ist), aber das löst mein Problem nicht. –

-1

Der Code sieht bis auf das Komma nach 'new ServiceModule()' korrekt aus.

Es sollte in Global.asax.cs, nicht Global.aspx.cs sein.

+0

Bearbeitete den Dateinamen in der Frage. Es war ein Tippfehler. Das Komma spielt keine Rolle. es gibt Syntax ein. –

1

Aus welchem ​​Grund auch immer, ich habe festgestellt, dass, wenn Ihre global.asax.cs von NinjectHttpApplication OnApplicationStarted() erbt, nicht aufgerufen wird. Ändern Sie OnApplicationStarted(), um Init() zu überschreiben, und es sollte funktionieren.

Siehe unten:

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(), 
     }); 
    } 
} 
Verwandte Themen