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.

Foi útil?

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.

http://msdn.microsoft.com/en-us/library/bb384297.aspx

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top