Session einmal anders verwalten

Zugriffe: 5648 starstarstarstarstarstarstarstarstarstar Bewertung:3,58 (12 Bewertungen) 14.11.2009

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.

Bild1

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.

Bild2

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

Bild3

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:

Bild4

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,

Bild4a

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:

Bild4b

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

Bild4c

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.

Bild5

Bild5a

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

Bild6

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.


Neuen Kommentar verfassen

Bestätigungscode