2010-10-03 3 views
0

J'ai un nouveau projet MVC 2 utilisant ninject 2 pour IOC. J'ai le global.asax suivant qui met en place à la fois NHibernate et Ninject. Le code fonctionne bien, ninject retire les contrôleurs de l'assemblage (il les convertit en chaînes de minuscules quand il le fait - dans la source Ninject). Toutes les URL de mon contrôleur sont maintenant sensibles à la casse, donc/Home ne sera pas résolu mais/home le sera. Lorsque j'utilise une première lettre majuscule (le defualt dans MVC), j'obtiens l'erreur "L'IControllerFactory 'Ninject.Web.Mvc.NinjectControllerFactory' n'a pas retourné de contrôleur pour le nom 'Home'."Ninject 2 avec les noms de contrôleur sensibles à la casse MVC 2

Surly ce n'est pas normal? Des idées?

Classe publique MvcApplication: NinjectHttpApplication { public static ISessionFactory SessionFactory = CreateSessionFactory(); public MvcApplication() { this.BeginRequest + = nouveau gestionnaire d'événements (MvcApplication_BeginRequest); this.EndRequest + = new EventHandler (MvcApplication_EndRequest); }

void MvcApplication_BeginRequest(object sender, EventArgs e) 
    { 
     CurrentSessionContext.Bind(SessionFactory.OpenSession()); 
    } 

    void MvcApplication_EndRequest(object sender, EventArgs e) 
    { 
     CurrentSessionContext.Unbind(SessionFactory).Dispose(); 
    } 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

    } 

    private static ISessionFactory CreateSessionFactory() 
    { 
     var cfg = new Configuration().Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "nhibernate.config")); 
     cfg.SetProperty(NHibernate.Cfg.Environment.ConnectionString, @"Data Source=.\;Initial Catalog=xxxxxx;Integrated Security=true;"); 
     //cfg.SetProperty(NHibernate.Cfg.Environment.ConnectionString, System.Environment.MachineName); 
     NHibernateProfiler.Initialize(); 
     return cfg.BuildSessionFactory(); 
    } 

    protected override void OnApplicationStarted() 
    { 
     base.OnApplicationStarted(); 
     AreaRegistration.RegisterAllAreas(); 
     RegisterRoutes(RouteTable.Routes); 
     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

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

    } 
} 

Répondre

0

Je me demande ce que la ligne RegisterAllControllersIn(Assembly.GetExecutingAssembly()); fait? Je ne le vois pas dans le code Ninject. Vous ne devriez pas avoir besoin d'appeler un contrôleur spécifique, car Ninject les trouvera et les construira seul.

+0

Quand je lance le programme de débogage et de le suivre le long il trouve tous les contollers (actuellement un peu la maison et des comptes contrôleurs, comme c'est un nouveau projet). C'est juste qu'il semble les enregistrer en tant que «maison» et «comptes» tout en minuscules, donc quand j'essaie de les parcourir, il échoue à moins que j'ajuste le cas. – Orange

+0

Je suis sûr que vous le savez mais pour être plus clair le RegisterAllControllersIn (Assembly.GetExecutingAssembly()); appelle une méthode de la sous-classe NinjectHttpApplication, c'est ce qui permet à Ninject d'explorer et de sortir les contrôleurs. NinjectHttpApplication est de Ninject.Web.Mvc qui est une DLL pour que Ninject s'intègre bien avec MVC. Je ne peux pas comprendre pourquoi c'est sensible à la casse. – Orange

+0

Aha ... Je regardais le code pour NinjectHttpApplication dans le dossier MVC2 du code Ninject, il semble que RegisterAllControllers est seulement dans le dossier MVC1. J'essaierais d'utiliser le code MVC2/binaires et voir où cela vous mène. –

Questions connexes