Ninject 2 с именами контроллеров MVC 2 с учетом регистра

У меня есть новый проект MVC 2, использующий ninject 2 для IOC. У меня есть следующий global.asax, который устанавливает как NHibernate, так и Ninject. Код работает нормально, ninject извлекает контроллеры из сборки (когда это происходит, он преобразует их в строки нижнего регистра - внутри исходного кода Ninject).

Все URL-адреса моих контроллеров теперь чувствительны к регистру, поэтому / Home не разрешится, но / home будет.

Когда я использую первую букву в верхнем регистре (по умолчанию в MVC), я получаю сообщение об ошибке «IControllerFactory 'Ninject.Web.Mvc.NinjectControllerFactory' не вернул контроллер для имени 'Home'».

Что ж, это ненормально? Любые идеи?

открытый класс MvcApplication: NinjectHttpApplication {общедоступный статический ISessionFactory SessionFactory = CreateSessionFactory (); общедоступный MvcApplication () {this.BeginRequest + = новый обработчик событий (MvcApplication_BeginRequest); this.EndRequest + = новый обработчик событий (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(),
    });

    }
}

person Orange    schedule 03.10.2010    source источник


Ответы (2)


Мне интересно, что делает строка RegisterAllControllersIn(Assembly.GetExecutingAssembly());? Я не вижу этого в коде Ninject. Вам не нужно вызывать какой-либо конкретный контроллер registrationg, поскольку Ninject найдет их и построит самостоятельно.

person Dave Thieben    schedule 04.10.2010
comment
Когда я запускаю программу в режиме отладки и слежу за ней, она находит все контроллеры (в настоящее время только контроллеры Home и Accounts, поскольку это новый проект). Просто кажется, что они регистрируются как «домашние» и «учетные записи» в нижнем регистре, поэтому, когда я пытаюсь перейти к ним, это терпит неудачу, если я не изменю регистр. - person Orange; 05.10.2010
comment
Я уверен, что вы это знаете, но для большей ясности RegisterAllControllersIn (Assembly.GetExecutingAssembly ()); вызывает метод подкласса NinjectHttpApplication, это то, что заставляет Ninject ползать и вытаскивать контроллеры. NinjectHttpApplication - это библиотека Ninject.Web.Mvc, которая обеспечивает хорошую интеграцию Ninject с MVC. Я просто не могу понять, почему это чувствительно к регистру. - person Orange; 05.10.2010
comment
Ага ... Я смотрел код для NinjectHttpApplication в папке MVC2 кода Ninject, похоже, RegisterAllControllers находится только в папке MVC1. Я бы попробовал использовать код / ​​двоичные файлы MVC2 и посмотреть, к чему это приведет. - person Dave Thieben; 05.10.2010

RegisterAllControllersIn больше не используется в последней версии расширения, объединенной с Ninject 2.1. Поэтому мне удалось выполнить обновление до последней версии Ninject и расширения MVC. http://teamcity.codebetter.com/project.html?projectId=project3&tab=projectOverview

На GitHub также есть образец проекта на основе образца проекта VS2010: http://github.com/ninject/ninject.web.mvc/tree/master/mvc2/src/SampleApplication/

person Remo Gloor    schedule 29.10.2010