Wie ein Session / Host-Objekt für beide Anwendung eines Fensters und in Benutzung befindlichen Bahn zur Verfügung zu stellen?
-
04-07-2019 - |
Frage
Ich habe eine Web-Anwendung, die starke Nutzung des Sitzungsstatus stellt Informationen über die aktuellen Benutzer zu speichern, ihre persönlichen Einstellungen, ihren Sitzungsverlauf aufzeichnen und so weiter.
ich gefunden habe, mich Abrufen dieser Sitzung Informationen in meinem Business-Schicht, etwa so:
((UserSession)HttpContext.Current.Session["UserSession"]).User.Info
Dies stellt ein Problem - irgendwann in der Zukunft meiner Anwendung wird einen Windows-Client hat, die offensichtlich nicht den Web-Session Zustand verweisen können. Also muss ich einen Host oder maßgeschneiderte Session-Klasse, die ich in meinem Business-Schicht verweisen kann, die Agnostiker ist, ob die Anwendung auf dem Web-oder Desktop ausgeführt wird. So etwas wie:
IHost.User.Info
Hinter den Kulissen wird die Web-Implementierung nutzt offensichtlich die Sitzungsstatusinformationen zu speichern, aber ich brauche diese aus meiner Business-Schicht zu verstecken. Hat jemand dieses Problem gelöst oder bekam jede practival Ratschläge, wie man am besten, diesen Ansatz?
Hilfe geschätzt.
Lösung
Unter der Annahme, dass die Business-Schicht eine separate DLL ist, würde ich nie einen Verweis auf System.Web
und in Folge hinzufügen Ich würde nie direkt das Session
Objekt verwenden. Dies würde zu einer anderen Gestaltung der Business-Schicht führen und der exponierten Schnittstellen zu einem Client (entweder Web oder WinForms).
Das heißt, als eine schnelle Abhilfe würde ich vorschlagen, eine Wrapper-Klasse in Ihrer Business-Schicht zu schreiben, die das Session
Objekt aus dem Code verbergen. Ihre Anrufe von Code wird so etwas wie dieses:
((UserSession) DualContext.Current["UserSession"]).User.Info
und die Wrapper-Implementierung wird in etwa so (nicht fertig gestellt und getestet) werden:
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;
}
}
}
Andere Tipps
Es wäre eine Neugestaltung der Architektur nehmen, aber wenn Sie wechseln von der Verwendung des Sitzungsstatus zu Benutzerprofilen Sie dann auf Client Application Service nutzen, um die Informationen zu teilen.
Ich denke, Sie brauchen einen Webservice oder Restfull-Dienst zu erstellen. Der Dienst wird eine XML-Datei darstellt, Ihre Benutzerinformationen zurück. Sie können den Dienst Widerrist von Ihnen Windows oder Web-Anwendung aufzurufen.