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
) устанавливается к тому времени.
Есть ли хороший способ получить то, что я пытаюсь сделать здесь?