Sessions in einer eCommerce Applikation
Um einen Kunden am Shop anzumelden, mit seinen Preisen darzustellen, ihm einen Einkaufskorb zu ermöglichen etc. muss der Shop einen Status halten. Selbst innerhalb eines zustandslosen REST Calls wird zwischen einzelnen Zugriffen auf das Objektmodell ein Status zwischen den verschiedenen Methodenaufrufen erhalten werden müssen.
Das Objektmodell des Shops verwendet für das Halten der Session ein eigenes Objekt, das innerhalb einer Webserver Umgebung seinerseits auf das System.Web.HttpContext.Session Objekt baut (dort wird ein Objekt unter dem Namen “centauri” ins Session-Objekt geschrieben).
Steht dieses Objekt nicht zur Verfügung, verwendet die aktuelle Implementierung eine globale Variable, um die aktuelle Session über mehrere Codeteile hinweg zu halten.
Der Zugriff auf dieses Objekt erfolgt über
var state = Centauri.Data.State.Current();
Anschließend können über die Variable state mit den Methoden Add(), Remove(), etc. Werte und ganze Objekte in den State gespeichert werden.
Die Verwendung von Centauri.Data.State erfolgt normalweise nur innerhalb des Objektmodells und nicht in der Shop Implementierung.
Centauri.Data.State und Centauri.Shop.State haben komplett verschiedene Aufgaben. Während Centauri.Shop.State den kaufmännischen Zustand einer Kundensession im Shop abbildet, ist Centauri.Data.State ein dynamisches Array für verschiedene technische Zustände innerhalb des Shops. Centauri.Shop.State setzt auf diesem dynamischen Array auf, um die Kundensession zu realisieren.
Beispielsweise enthält die Implementierung von Centauri.Shop.State.Customer (zur Abfrage des aktuell angemeldeten Kunden):
var state = Centauri.Data.State.Current();
var customer = (Customer)state.Find("customer");
return customer;
Um einen Wert in die Session zu speichern
var state = Centauri.Data.State.Current();
state.Add( "IPAdresseDesKunden", System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]);
Um die Werte aus der Session zu holen
var state = Centauri.Data.State.Current();
var ip = state.Find( "IPAdresseDesKunden");
Find() liefert null zurück, wenn der Name noch nicht im State gespeichert ist.