Внедрение HttpContext.Current.Session в устаревший код с использованием Castle Windsor - PullRequest
2 голосов
/ 14 июля 2011

tl; dr :
В устаревшем приложении информация о культуре хранится в HttpContext.Current.Session["culture"].Как мне ввести DI с Windsor, чтобы при запуске приложение по-прежнему получало и устанавливало там информацию о культуре, но я мог высмеивать ее в своих тестах?

Полный фон:
У меня есть какой-то устаревший код для локализации, который я хочу реорганизовать, чтобы включить макетирование и тестирование.В настоящее время пользовательский класс Lang выбирает локализованные строки на основе предоставленного string key и HttpContext.Current.Session["culture"] as CultureInfo.

Моя первоначальная идея состояла в том, чтобы просто внедрить экземпляр CultureInfo с помощью Windsor и установить его, чтобы получитьэто из того же места, что и раньше при запуске всего веб-приложения, но при тестировании я бы просто зарегистрировал new CultureInfo("en-GB") вместо этого.Вот что я придумал для установщиков:

public class CultureInfoFromSessionInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register( // exception here (see comments below)
            Component.For<CultureInfo>()
            .Instance(HttpContext.Current.Session["culture"] as CultureInfo)
            .LifeStyle.PerWebSession());
    }
}
class EnglishCultureInfoInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(
            Component.For<CultureInfo>()
            .Instance(new CultureInfo("en-GB")));
    }
}

Но теперь при запуске приложения в указанной строке я получаю исключение нулевой ссылки.Я подозреваю, что это потому, что я пытаюсь подключить это слишком рано - контейнер инициализирован, и установщик зарегистрирован под Application_Start в Global.asax.cs, и я не уверен HttpContext.Current.Session (или даже HttpContext.Current) устанавливается к тому времени.

Есть ли хороший способ получить то, что я пытаюсь сделать здесь?

1 Ответ

5 голосов
/ 14 июля 2011

Задержка создания экземпляра компонента:

container.Register( 
        Component.For<CultureInfo>()
        .UsingFactoryMethod(() => HttpContext.Current.Session["culture"] as CultureInfo)
        .LifeStyle.PerWebSession());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...