Gelegentlich ist es hilfreich, innerhalb seiner Webanwendung Informationen in eine Session abzuspeichern. Problematisch könnte hierbei sein, dass Sessions über einen Key verwaltet werden. Oft schon habe ich in Foren gelesen, dass Benutzer Stunden mit der Fehlersuche zugebracht haben, gleich dieser eigentlich offensichtlich war und in der fehlerhaften Schreibweise des Sessionkeys lagen.
Hierzu kann man über einen recht einfachen Weg für Klarheit sorgen:
Zum einen legt man sich einen Enum an, der letztlich alle Sessionkeys verwaltet. Das hat auch den entscheidenen Vorteil, dass man nicht ewig suchen muss, um herauszufinden, wie der Key richtig heißt oder ob es ihn überhaupt gibt. Gerade in Teams kann dies recht hilfreich sein. Ein anderer Vorteil ist natürlich das einhergehende Intellisense.

Im zweiten Step erzeuge ich mir eine statische Klasse zum eigentlichen Verwalten der Sessions. Die Klasse - ich nenne sie mal AppSession - hat zwei Methoden: Set und Get. Beide Methoden bekommen zum einen den Enum übergeben, der den Sessionkey repräsentiert und die Set-Methode bekommt zusätzlich den Value vom Type object mitübergeben.
Und das war dann schon die ganze Herrlichkeit.

In der späteren Konsumierung schauts doch dann recht übersichtlich und leicht verständlich aus.

Ja jetzt könnte man meinen, "ja so könnte man es machen, aber das geht doch auch noch viel cooler...". Klar geht das.
Man könnte jetzt Extension Methods benutzen und so das Page.Session-Objekt erweitern.
Dann würde das am Ende so ausschauen:

Eine statische Klasse für die erweiternden Methoden. Auch hier wieder die Methoden Set und Get. this ist hier vom Type System.Web.SessionState.HttpSessionState, damit die Erweiterung auch auf Page.Session greift. Statt des Methodennamens Set könnte man auch die Add-Methode überladen,

das würde auch gehen - in diesem Fall würde ich der Einheitlichkeit halber und der klaren Abgrenzung wegen bei Set als Bezeichner bleiben wollen. Man kann auch beides implementieren.
Die Implementierung schaut dann vollständig folgendermaßen aus:

Der Aufruf bleibt dann auch wieder übersichtlich und verständlich:

Wenn ich schon bei Erweiterungen bin, dann könnte ich natürlich auch den Enum erweitern um die Methoden Get und Set, so dass ich auf diesem Wege wieder den Sessionwert ermitteln bzw. setzen kann.
Die Implementierung orientiert sich dann anlog dem vorhergehenden Beispiel.


Am Ende rufe ich in jeder Implementierung die Get/Set-Methode der statischen Klasse AppSession auf.

Zum Debuggen sicher von Vorteil, da ich wieder eine zentrale Stelle habe, wo ich das Setzen oder Abrufen des Sessionwertes überwachen kann.
Der Vollständigkeit halber sollte man auch eine Remove-Methode nach der selben Vorgehensweise implementieren.
Den vollständigen Code findet ihr unter dotnet-snippets.de hier.
Nach Abschluss des Snippet-Wettbewerbes, also ab dem 13.12.09 gibt es die Beispielklasse nebst Enumbeispiel hier auch zum Download als Visual Studio 2008 Projekt.
Viel Spass beim Ausprobieren.
Download: Codebeispiel.zip - (172 mal herunter geladen).
Ihr Kommentar zu diesem Beitrag: