2010-10-03 38 views
0

我有一個新的MVC 2項目使用ninject 2 IOC。我有以下global.asax設置NHibernate和Ninject。代碼運行良好,ninject從程序集中取出控制器(當它執行此操作時,它將它們轉換爲lowe字符串 - 在Ninject源代碼中)。Ninject 2與MVC 2區分大小寫的控制器名稱

我所有的控制器URL現在都區分大小寫,所以/ Home不會解析,但是/ home會解決。

當我使用大寫的第一個字母(MVC中的錯誤)時,出現錯誤「IControllerFactory'Ninject.Web.Mvc.NinjectControllerFactory'沒有返回名稱爲'Home'的控制器。

這是不是很正常?有任何想法嗎?公共類MvcApplication:NinjectHttpApplication { 公共靜態ISessionFactory SessionFactory = CreateSessionFactory();公共類。 public MvcApplication() this.BeginRequest + = new EventHandler(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(), 
    }); 

    } 
} 

回答

0

我想知道的RegisterAllControllersIn(Assembly.GetExecutingAssembly());線做什麼?我在Ninject代碼中沒有看到。您不需要調用任何特定的控制器註冊表,因爲Ninject會自己找到並構建它們。

+0

當我在調試程序,並按照它沿着它發現所有的contollers(目前只是在家庭和帳戶控制器,因爲它是一個新項目)。只是它似乎將它們註冊爲「家庭」和「賬戶」都是小寫字母,所以當我嘗試瀏覽它們時,它會失敗,除非我調整案例。 – Orange 2010-10-04 20:31:40

+0

我相信你知道這一點,但要更清楚RegisterAllControllersIn(Assembly.GetExecutingAssembly());調用子類NinjectHttpApplication的一個方法,這就是Ninject抓取並拉出控制器的原因。 NinjectHttpApplication來自Ninject.Web.Mvc,這是一個讓Ninject與MVC很好地集成的dll。我只是無法弄清楚爲什麼區分大小寫。 – Orange 2010-10-04 20:36:13

+0

啊哈......我在Ninject代碼的MVC2文件夾中查看NinjectHttpApplication的代碼,它顯示RegisterAllControllers只在MVC1文件夾中。我會嘗試使用MVC2代碼/二進制文件,並看看你在哪裏。 – 2010-10-05 14:52:06