2009-03-23 3 views
1

У меня есть webapp, который хранит объект конфигурации в ApplicationState. Этот объект содержит строку подключения к базе данных между прочим.Получение ApplicationState в asp.net без HttpContext

Иногда я запускаю асинхронный поток, чтобы выполнить несколько более длительных запущенных задач, таких как отправка писем и обновление базы данных.

Однако, поскольку этот поток не имеет HttpContext, я не могу получить объект конфигурации.

Я знаю этот дизайн, что все зависит от HttpContext, это плохо, но слишком поздно менять сейчас. Глядя на отражатель, я вижу, что класс HttpContext просто использует статический внутренний класс для получения ApplicationState. Есть ли другой способ добраться до него?

Все эти внутренние классы в .net действительно раздражают.

ответ

1

Просто передайте все, что вам нравится, в свою нить при запуске. Используйте делегата ParameterizedThreadStart, чтобы запустить его вместо простого делегата ThreadStart. Вы можете либо передать его HttpContext.Current, либо связать вместе информацию, которую хотите получить, и передать ее.

+0

Это по-прежнему требует доступа к HttpContext в какой-то момент. –

+0

Да, в точке, где создается поток. –

0

Если вы действительно нужен доступ к государственной Application (или аналогичной) с асинхронных обработчиков вы должны изменить свой HttpApplication подкласс (например, Global.asax) для хранения состояния приложения экземпляра (this.Application) на статическое свойство во Application_Start:

Было бы более целесообразным использовать фреймворк DI для регистрации этого экземпляра, но если у вас есть один доступ, вы, вероятно, могли бы избежать использования состояния приложения для хранения конфигурации. Кроме того, в .NET есть инфраструктура конфигурации, которая напрямую решает эту проблему и обеспечивает возможность читать конфигурацию из любого места.

Смежные вопросы