Domanda

Ho un'applicazione Web che fa un uso intensivo dello stato della sessione per memorizzare informazioni sull'utente corrente, le sue impostazioni personali, registrare la cronologia delle sessioni e così via.

Mi sono ritrovato a recuperare queste informazioni sulla sessione nel mio livello aziendale, in questo modo:

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

Ciò pone un problema: ad un certo punto in futuro la mia applicazione avrà un client Windows che ovviamente non può fare riferimento allo stato della sessione web. Quindi ho bisogno di un host o di una classe di sessione personalizzata a cui posso fare riferimento nel mio livello aziendale che è indipendente dal fatto che l'applicazione sia in esecuzione sul Web o sul desktop. Qualcosa del tipo:

IHost.User.Info

Dietro le quinte, l'implementazione web utilizzerà ovviamente lo stato Session per archiviare informazioni, ma devo nasconderle dal mio livello aziendale. Qualcuno ha risolto questo problema o ha ricevuto consigli pratici sul modo migliore di affrontarlo?

Aiuto apprezzato.

È stato utile?

Soluzione

Supponendo che il livello aziendale sia una DLL separata, non aggiungerei mai un riferimento a System.Web e di conseguenza non utilizzerei mai direttamente l'oggetto Session . Ciò porterebbe a una diversa progettazione del livello aziendale e delle interfacce esposte a un client (Web o Winforms).

Detto questo, come soluzione rapida suggerirei di scrivere una classe wrapper nel tuo livello aziendale che nasconda l'oggetto Session dal tuo codice. Le tue chiamate dal codice saranno qualcosa del genere:

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

e l'implementazione del wrapper sarà qualcosa del genere (non completato e testato):

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

Altri suggerimenti

Ci vorrebbe un po 'di riprogettazione, ma se si passa dall'uso dello stato della sessione ai profili utente, è possibile utilizzare i servizi dell'applicazione client per condividere le informazioni.

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

Suppongo sia necessario creare un servizio Web o un servizio RESTfull. Il servizio restituirà un file XML che rappresenta le informazioni dell'utente. Sarai in grado di richiamare il servizio appassire da Windows o dall'applicazione Web.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top