Kontynuacja tego, co powiedzieli inni. Zwykle mam dwie warstwy:
Warstwa rdzeniowa. Znajduje się w bibliotece DLL, która jest dodawana do prawie wszystkich projektów aplikacji sieci Web . W tym mam klasę SessionVars, która wykonuje podstawową pracę dla pobierających / ustawiających stan sesji. Zawiera kod podobny do następującego:
public class SessionVar
{
static HttpSessionState Session
{
get
{
if (HttpContext.Current == null)
throw new ApplicationException("No Http Context, No Session to Get!");
return HttpContext.Current.Session;
}
}
public static T Get<T>(string key)
{
if (Session[key] == null)
return default(T);
else
return (T)Session[key];
}
public static void Set<T>(string key, T value)
{
Session[key] = value;
}
}
Zwróć uwagę na ogólne zasady uzyskiwania dowolnego typu.
Następnie dodaję również Getters / Setters dla określonych typów, zwłaszcza stringów, ponieważ często wolę pracować z string.Empty zamiast null dla zmiennych prezentowanych Użytkownikom.
na przykład:
public static string GetString(string key)
{
string s = Get<string>(key);
return s == null ? string.Empty : s;
}
public static void SetString(string key, string value)
{
Set<string>(key, value);
}
I tak dalej...
Następnie tworzę opakowania, aby to wyodrębnić i przenieść do modelu aplikacji. Na przykład, jeśli mamy dane klienta:
public class CustomerInfo
{
public string Name
{
get
{
return SessionVar.GetString("CustomerInfo_Name");
}
set
{
SessionVar.SetString("CustomerInfo_Name", value);
}
}
}
Masz rację? :)
UWAGA: Właśnie pomyślałem, dodając komentarz do zaakceptowanej odpowiedzi. Zawsze upewnij się, że obiekty można serializować podczas przechowywania ich w sesji podczas korzystania z serwera stanu. Próba zapisania obiektu przy użyciu typów generycznych na farmie internetowej może być zbyt łatwa i szybko się rozwija. Wdrażam na farmie internetowej w pracy, więc dodałem kontrole do mojego kodu w warstwie podstawowej, aby zobaczyć, czy obiekt jest możliwy do serializacji, kolejna korzyść z hermetyzowania metod pobierających i ustawiających sesje :)