2010-02-11 5 views
6

J'utilise: -Comment puis-je utiliser ninject 2.0 avec asp.net mvc 2?

  1. asp.net mvc rc 2
  2. Ninject et ninject asp.net l'extension mvc (http://github.com/enkari/ninject.web.mvc)

Je continue à obtenir le « Aucun constructeur parameterless défini pour cette objet.' pour mon AccountController. Le AccountController est injecté avec les services. Les liaisons pour ces services sont définies dans le ServiceModule.

Vous trouverez ci-dessous le code de mon application MvcApplication dans 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

ce que d'autres contrôleurs de travail? Avez-vous construit le projet Ninject.Web.Mvc contre ASP.NET MVC 2 RC 2? – Charlino

+0

@Charlino. Merci ça a marché. –

Répondre

7

La reconstruction de Ninject.Web.Mvc par rapport aux DLL ASP.Net MVC 2 a résolu le problème. Le problème est avec la classe NinjectControllerFactory. La signature de la méthode pour obtenir l'instance du contrôleur a changé dans MVC 2.

IController GetControllerInstance(Type controllerType) 

Pour

IController GetControllerInstance(
     RequestContext requestContext, Type controllerType) 

Effectuez les modifications nécessaires et la reconstruction de l'extension Ninject MVC et tout fonctionne très bien. Merci à @Charlino pour la suggestion.

+1

Bon à entendre. Gutted je n'ai pas fait une réponse et obtenir les points! ;-) – Charlino

-1

Dans Ninject, vous n'êtes pas censé remplacer la méthode Application_Start. Si vous avez besoin de faire des choses qui ne sont pas automatiques (comme enregistrer des zones - je ne sais pas si Ninject fait cela aussi pour vous), assurez-vous d'appeler le base.OnApplicationStarted() pour que tous les trucs de Ninject fonctionnent correctement.

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

    // Kick some butt here 
} 
+0

De ce que je vois dans le fichier 'NinjectHttpApplication.cs', la fonction est vide. Je suis d'accord que je devrais le faire comme vous l'avez dit (parce que c'est virtuel), mais cela ne résout pas mon problème. –

-1

Le code semble correct à l'exception de la virgule après 'new ServiceModule()'.

Il devrait être dans Global.asax.cs, pas Global.aspx.cs.

+0

Modifié le nom du fichier dans la question. C'était une erreur de frappe. La virgule n'a pas d'importance. c'est la syntaxe de frappe. –

1

Pour n'importe quelle raison, j'ai trouvé que si votre global.asax.cs hérite de NinjectHttpApplication OnApplicationStarted() n'est pas appelé. Changez votre OnApplicationStarted() pour remplacer Init(), et cela devrait fonctionner.

Voir ci-dessous:

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(), 
     }); 
    } 
} 
Questions connexes