Obtendo ApplicationState em asp.net sem HttpContext
-
21-08-2019 - |
Pergunta
Eu tenho um webapp que armazena um objeto config na ApplicationState. Este objeto contém a string de conexão ao banco de dados, entre outras coisas.
Às vezes eu iniciar uma discussão assíncrona para fazer um tarefas alguns já em execução, como o envio de e-mails e atualizar o banco de dados.
Entretanto, desde que esta discussão não tem um HttpContext eu não posso chegar para o objeto de configuração.
Eu sei que este design que tudo depende HttpContext é ruim, mas isso é tarde demais para mudar agora. Olhando para refletor eu vejo que a classe HttpContext apenas usa uma classe interna estática para obter o ApplicationState. Existe alguma outra forma de obter para ele?
Todas essas classes internas em .net são realmente irritante.
Solução
Basta passar o que quiser para o seu segmento quando você iniciá-lo. Use um ParameterizedThreadStart delegado para iniciá-lo em vez de apenas um ThreadStart delegar. Você poderia passá-lo HttpContext.Current, ou então pacote em conjunto as informações que deseja seu segmento de ter, e passá-lo.
Outras dicas
Se você realmente Acesso à necessidade de Estado Aplicação (ou similar) de manipuladores assíncronos você deve modificar sua subclasse HttpApplication
(por exemplo Global.asax) para armazenar a instância Estado Aplicação (this.Application
) para uma propriedade estática durante Application_Start
:
public static HttpApplicationStateWrapper State { get; private set; }
protected void Application_Start()
{
State = new HttpApplicationStateWrapper(this.Application);
}
Seria mais apropriado usar um quadro DI para registrar este exemplo, mas se você tiver um disponível, você provavelmente poderia evitar o uso de Estado Aplicação totalmente para o armazenamento de configuração. Além disso, há uma estrutura de configuração em .NET que aborda diretamente essa necessidade e fornece a capacidade de ler a configuração de qualquer lugar.