Наслідувати те, що сказали інші. Я, як правило, маю два шари:
Основний шар. Це всередині DLL, яка додається майже до всіх проектів веб-додатків . У цьому класі я маю клас SessionVars, який виконує роботу з рохканням для геттерів / сетерів стану сеансу. Він містить такий код:
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;
}
}
Зверніть увагу на загальні препарати для отримання будь-якого типу.
Потім я також додаю Getters / Setters для певних типів, особливо рядок, оскільки я часто віддаю перевагу роботі з string.Empty, а не null для змінних, представлених Користувачам.
наприклад:
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);
}
І так далі...
Потім я створюю обгортки, щоб абстрагувати це та довести його до моделі програми. Наприклад, якщо у нас є дані про клієнта:
public class CustomerInfo
{
public string Name
{
get
{
return SessionVar.GetString("CustomerInfo_Name");
}
set
{
SessionVar.SetString("CustomerInfo_Name", value);
}
}
}
Ви правильно зрозуміли ідею? :)
ПРИМІТКА: Я просто задумався, додавши коментар до прийнятої відповіді. Завжди переконайтесь, що об’єкти можна серіалізувати, зберігаючи їх у сеансі під час використання сервера стану. Це може бути надто легко спробувати зберегти об’єкт, використовуючи загальні засоби, коли перебуваєш на веб-фермі, і це бум. Я розгортаю у веб-фермі на роботі, тому додав перевірки до мого коду на базовому рівні, щоб побачити, чи об’єкт можна серіалізувати, ще одна перевага інкапсуляції сетевих збирачів та сетерів :)