¿Cómo proporcionar un objeto Session / Host para usar en Windows y en una aplicación web?

StackOverflow https://stackoverflow.com/questions/236362

Pregunta

Tengo una aplicación web que hace un uso intensivo del estado de la sesión para almacenar información sobre el usuario actual, su configuración personal, registrar su historial de sesión, etc.

Me encontré recuperando esta información de sesión en mi capa empresarial, así:

((UserSession)HttpContext.Current.Session["UserSession"]).User.Info

Esto plantea un problema: en algún momento en el futuro, mi aplicación tendrá un cliente de Windows que obviamente no puede hacer referencia al estado de la sesión web. Por lo tanto, necesito un host o una clase de sesión personalizada a la que pueda hacer referencia en mi capa empresarial que sea independiente de si la aplicación se ejecuta en la web o en el escritorio. Algo así como:

IHost.User.Info

Detrás de escena, la implementación web obviamente utilizará el estado de Sesión para almacenar información, pero necesito ocultar esto de mi nivel de negocio. ¿Alguien ha resuelto este problema u obtuvo algún consejo práctico sobre la mejor manera de abordarlo?

Ayuda apreciada.

¿Fue útil?

Solución

Suponiendo que la capa empresarial es una DLL separada, nunca agregaría una referencia a System.Web y, en consecuencia, nunca usaría el objeto Session directamente. Esto llevaría a un diseño diferente de la capa empresarial y de las interfaces expuestas a un cliente (ya sea web o winforms).

Dicho esto, como una solución rápida, sugeriría escribir una clase de contenedor en su capa empresarial que oculte el objeto Session de su código. Sus llamadas desde el código serán algo como esto:

((UserSession) DualContext.Current["UserSession"]).User.Info

y la implementación del contenedor será algo como esto (no completado y probado):

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;
      }
   }
}

Otros consejos

Se necesitaría una nueva remodelación, pero si cambia de usar Estado de sesión a Perfiles de usuario, podría usar los Servicios de aplicación de cliente para compartir la información.

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

Supongo que necesita crear un servicio web o un servicio RESTfull. El servicio devolverá un archivo XML que representa su información de usuario. Podrá invocar el servicio desde su ventana o aplicación web.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top