Przechowywanie obiektów w sesji nie jest ogólnie wskazane ze względu na szybkość działania strony (poza typem InProc) jak i ulotność miejsca składowania (InProc). Mimo wszystko czasami trzeba. Aby ułatwić sobie pracę z obiektem sesji napisałem kilka pomocniczych metod rozszerzających możliwości HttpSessionStateBase.
Bardzo często zdarzają się przypadki przechowania czegoś na chwilę w kontekście użytkownika. Określamy zatem jakiś klucz i dodajemy do sesji. W innym miejscu aplikacji znów musimy posłużyć się tym samym kluczem, pod którym schowaliśmy sobie jakieś dane w sesji.
A gdyby tak pozbyć się tego klucza i tworzyć go po cichu automatycznie?
Na takim pomyśle opiera się działanie poniższych metod. Oczywiście nie zawsze da się pozbyć klucza dlatego też wszystkie metody mają dodatkowe przeciążenie. Dodatkowo wszystkie metody są typowane.
Podstawowymi działaniami są zapamiętanie obiektu w sesji i jego pobranie. Do tego służą odpowiednio metody AddItem oraz GetItem.
Przykładowo zapamiętujemy i odczytujemy obiekt typu UserContext w następujący sposób:
1: var ctx = new UserContext();
2: Session.AddItem<UserContext>(ctx);
3: // ...
4: // W innym miejscu aplikacji
5: var ctx2 = Session.GetItem<UserContext>();
Kod całej klasy zawierającej wszystkie metody znajduje się poniżej.
1: public static class HttpSessionExtensions
2: {
3: public static void AddItem<T>(this HttpSessionStateBase s, T value) where T : class
4: {
5: AddItem<T>(s, value, "");
6: }
7:
8: public static void AddItem<T>(this HttpSessionStateBase s, T value, string key)
9: {
10: s.Add(typeof(T).FullName + key, value);
11: }
12:
13: public static T GetItem<T>(this HttpSessionStateBase s) where T : class
14: {
15: return GetItem<T>(s, "");
16: }
17:
18: public static T GetItem<T>(this HttpSessionStateBase s, string key)
19: {
20: var value = s[typeof(T).FullName + key];
21: return value == null ? default(T) : (T)s[typeof(T).FullName + key];
22: }
23:
24: public static T TakeItem<T>(this HttpSessionStateBase s) where T : class
25: {
26: return TakeItem<T>(s, "");
27: }
28:
29: public static T TakeItem<T>(this HttpSessionStateBase s, string key)
30: {
31: var value = GetItem<T>(s, key);
32: RemoveItem<T>(s, key);
33: return value;
34: }
35:
36: public static void RemoveItem<T>(this HttpSessionStateBase s) where T : class
37: {
38: RemoveItem<T>(s, "");
39: }
40:
41: public static void RemoveItem<T>(this HttpSessionStateBase s, string key)
42: {
43: s.Remove(typeof(T).FullName + key);
44: }
45: }
Nie będę opisywał wszystkich pokolei, bo doskonale widać co każda z nich robi.
Proszę się częstować :)
PS
Tak naprawdę są to metody, które rozszerzają HttpSessionStateBase z frameworka ASP.NET MVC, ale wystarczy zamienić klasę bazową na HttpSessionState, aby kod działał poprawnie w klasycznych WebFormsach.
Ten artykuł jest widoczny także na:
ZINE.NETJeśli spodobał Ci się ten artykuł, to podziel się tą informacją z innymi.