Question

J'ai une application Web qui utilise beaucoup l'état de session pour stocker des informations sur l'utilisateur actuel, ses paramètres personnels, enregistrer l'historique de ses sessions, etc.

Je me suis retrouvé à récupérer les informations de cette session dans ma couche de gestion, comme suit:

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

Cela pose un problème - à un moment donné, mon application aura un client Windows qui ne peut évidemment pas faire référence à l'état de la session Web. J'ai donc besoin d'un hôte ou d'une classe de session personnalisée que je puisse référencer dans ma couche de gestion, indépendamment du fait que l'application s'exécute sur le Web ou sur le bureau. Quelque chose comme:

IHost.User.Info

En coulisse, l’implémentation Web utilisera évidemment l’état de session pour stocker des informations, mais je dois le cacher à l’écart de ma couche de gestion. Quelqu'un a-t-il résolu ce problème ou obtenu un conseil pratique sur la meilleure façon de l'aborder?

Aide appréciée.

Était-ce utile?

La solution

En supposant que la couche de gestion constitue une DLL distincte, je n’ajouterai jamais de référence à System.Web et, par conséquent, je n’utiliserai jamais directement l’objet Session . Cela conduirait à une conception différente de la couche de gestion et des interfaces exposées vers un client (Web ou winforms).

Cela étant dit, pour remédier rapidement à ce problème, je vous suggérerais d'écrire dans votre couche métier une classe wrapper masquant l'objet Session de votre code. Vos appels à partir du code ressembleront à ceci:

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

et l'implémentation du wrapper ressemblera à ceci (non terminé et testé):

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

Autres conseils

Cela nécessiterait une nouvelle architecture, mais si vous passez de l'état de session aux profils d'utilisateurs, vous pouvez utiliser les services d'application client pour partager les informations.

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

Je suppose que vous devez créer un service Web ou un service RESTfull. Le service renverra un fichier XML représentant vos informations utilisateur. Vous pourrez invoquer le service à partir de votre fenêtre ou de votre application Web.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top