Kilka metod ułatwiających pracę z obiektem sesji

01 lutego 2010, 22:47

KomentarzeKomentarze: 2 KategorieKategorie: asp.net mvc

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.NET

Jeśli spodobał Ci się ten artykuł, to podziel się tą informacją z innymi.

Gravatar
Szymon Pobiega
2010-02-02 07:07

Może się czepiam, ale patrząc na Twój kod, linijka 2 przykładu mogłaby wyglądać jeszcze prościej:

2: Session.AddItem(ctx);

Gravatar
dario-g
2010-02-02 09:14

Masz rację, gdyby nie jeden mały fakt - 'where T : class

'. Ogólnie chciałem zastrzec, aby nie można było wkładać do sesji typów prostych bez klucza. Stąd taka a nie inna konstrukcja metody. :)

Dodaj komentarz Dodaj komentarz

Twój email (niepublikowany/opcjonalnie):

Twoja strona (opcjonalnie):

Imię i nazwisko/nick (wymagane):

Treść (wymagane):

Chcę być poinformowany o kolejnych komentarzach:

Te pola zostaw puste

Uwaga! Zastrzegam sobie prawo do usuwania obraźliwych i wulgarnych komentarzy.