Come fornire un oggetto Session / Host da utilizzare in un'applicazione Windows e Web?
-
04-07-2019 - |
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.
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.
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.