Como fornecer um objeto de sessão/host para uso em um aplicativo Windows e Web?
-
04-07-2019 - |
Pergunta
Eu tenho um aplicativo da Web que faz uso pesado do estado da sessão para armazenar informações sobre o usuário atual, suas configurações pessoais, registrar seu histórico de sessão e assim por diante.
Eu me vi recuperando esta informação de sessão na minha camada de negócios, assim:
((UserSession)HttpContext.Current.Session["UserSession"]).User.Info
Isso representa um problema - em algum momento no futuro, meu aplicativo terá um cliente do Windows que obviamente não pode fazer referência ao estado da sessão da Web. Por isso, preciso de um host ou classe de sessão personalizada que possa fazer referência na minha camada de negócios que é agnóstico se o aplicativo está em execução na web ou na área de trabalho. Algo como:
IHost.User.Info
Nos bastidores, a implementação da Web obviamente utilizará o estado da sessão para armazenar informações, mas preciso esconder isso da minha camada de negócios. Alguém resolveu esse problema ou recebeu algum conselho prático sobre a melhor forma de abordar isso?
Ajuda apreciado.
Solução
Supondo que a camada de negócios seja uma DLL separada, eu nunca adicionaria uma referência a System.Web
e em conseqüência eu nunca usaria o Session
objeto diretamente. Isso levaria a um design diferente da camada de negócios e das interfaces expostas a um cliente (Web ou Winforms).
Dito isto, como uma solução alternativa rápida, sugiro escrever uma aula de invólucro na sua camada de negócios que esconde o Session
objeto do seu código. Suas chamadas do código serão algo assim:
((UserSession) DualContext.Current["UserSession"]).User.Info
E a implementação do wrapper será algo assim (não concluído e testado):
public class DualContext
{
private Dictionary<string, object> winFormsSession = new Dictionary<string, object>();
private static readonly DualContext instance = new DualContext();
public static DualContext Current
{
get { return instance; }
}
public object this[string key]
{
get
{
if (HttpContext.Current != null)
return HttpContext.Current.Session[key];
else
return winFormsSession[key];
}
set
{
if (HttpContext.Current != null)
HttpContext.Current.Session[key] = value;
else
winFormsSession[key] = value;
}
}
}
Outras dicas
Seria necessário alguma re-arquiteta, mas se você mudar de uso do estado de sessão para os perfis de usuário, poderá usar os serviços de aplicativos clientes para compartilhar as informações.
Eu acho que você precisa criar um serviço da web ou um serviço RESTfull. O serviço retornará um arquivo XML representando as informações do seu usuário. Você poderá invocar o serviço que murcha de seu Windows ou aplicativo da Web.