Чтобы следовать из того, что сказали другие. Я предпочитаю два слоя:
Основной слой. Это внутри библиотеки 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, поскольку я часто предпочитаю работать с 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);
}
}
}
Вы правильно поняли? :)
ПРИМЕЧАНИЕ: Просто подумал, когда добавлял комментарий к принятому ответу. Всегда обеспечивайте сериализацию объектов при их сохранении в сеансе при использовании сервера состояний. Может быть слишком легко попытаться сохранить объект с помощью универсальных шаблонов, когда он находится на веб-ферме, и он быстро развивается. Я развертываю на работе веб-ферму, поэтому добавил в свой код на уровне ядра проверки, чтобы убедиться, что объект сериализуем, еще одно преимущество инкапсуляции методов получения и установки сеанса :)