Это взято из старого документа, но он все еще очень действителен и работает на удовольствие ... Я помещу здесь ссылку, особенно потому, что это старая ссылка, которая может исчезнуть. взято отсюда.
Фон
Объект Session в ASP.Net может использоваться для хранения информации, относящейся к конкретному пользователю сайта. Сеанс индексируется по имени ключа, и когда он используется напрямую таким образом, это может привести к большому количеству отдельных имен сеансов. Альтернативный подход заключается в создании одноэлементного объекта для группировки связанных элементов и сохранения этого объекта с заданным именем ключа. «Синглтон» - это общий шаблон проектирования, который указывает, как обеспечить, чтобы в любой момент времени существовал только один экземпляр класса.
Преимущества одноэлементных сессионных объектов
- Группировка элементов сеанса для организационных целей
- Особенно полезно для серии страниц, посвященных переходным процессам, таким как регистрация на сайте. После завершения процесса объект может быть очищен от сеанса, чтобы можно было восстановить память (лучше использовать сервер
ресурсы)
- Анализ влияния изменений информации о сеансе намного проще
- Определите области сайта, которые неправильно используют информацию (гораздо понятнее, чем просто использование имени переменной для определения целесообразности использования)
- Intellisense для имен и типов свойств при доступе к объекту
Недостатки одноэлементных сессионных объектов
Сложнее увидеть количество отдельных предметов в сессии
Результаты ASP.Net Trace не показывают значения внутри объекта
Снижение производительности при использовании хранения состояния сеанса вне процесса (влияет на сериализацию)
Осуществление
Первым шагом реализации является создание файла класса, который представляет логическую группу элементов, которые должны храниться вместе в одном объекте. Ниже приведен пример класса, который демонстрирует эту технику:
public class singleton
{
//Name that will be used as key for Session object
private const string SESSION_SINGLETON = "SINGLETON";
//Variables to store the data (used to be individual
// session key/value pairs)
string lastName = "";
string firstName = "";
public string LastName
{
get
{
return lastName;
}
set
{
lastName = value;
}
}
public string FirstName
{
get
{
return firstName;
}
set
{
firstName = value;
}
}
//Private constructor so cannot create an instance
// without using the correct method. This is
// this is critical to properly implementing
// as a singleton object, objects of this
// class cannot be created from outside this
// class
private singleton()
{
}
// Create as a static method so this can be called using
// just the class name (no object instance is required).
// It simplifies other code because it will always return
// the single instance of this class, either newly created
// or from the session
public static singleton GetCurrentSingleton()
{
singleton oSingleton;
if (null == System.Web.HttpContext.Current.Session[SESSION_SINGLETON])
{
//No current session object exists, use private constructor to
// create an instance, place it into the session
oSingleton = new singleton();
System.Web.HttpContext.Current.Session[SESSION_SINGLETON] = oSingleton;
}
else
{
//Retrieve the already instance that was already created
oSingleton = (singleton)System.Web.HttpContext.Current.Session[SESSION_SINGLETON];
}
//Return the single instance of this class that was stored in the session
return oSingleton;
}
}
Страница, которая хочет использовать этот объект, просто делает следующее:
singleton oSingleton = singleton.GetCurrentSingleton();
oSingleton.FirstName = "Robert";
oSingleton.LastName = "Boedigheimer";
Как правило, этот метод будет хранить гораздо больше переменных в данном классе или будет использоваться для серии веб-страниц, которые выполняют процесс. Другое преимущество использования этого для процесса на веб-сайте состоит в том, что вся память, необходимая для переменных сеанса, может быть очищена простым удалением ссылки на одноэлементный объект. Класс может реализовать метод, который клиенты могут использовать для очистки ссылки, он может называться Dispose (), чтобы следовать типичному шаблону .Net, когда класс предоставляет способ очистки:
public static void Dispose()
{
//Cleanup this object so that GC can reclaim space
System.Web.HttpContext.Current.Session.Remove(SESSION_SINGLETON);
}
Заключение
Существует много преимуществ использования одноэлементных объектов, хранящихся в объекте Session, вместо использования отдельных ключей сеанса для хранения информации. Это полезно для объектов, которые должны существовать в течение всего сеанса (группировка логических элементов, анализ воздействия, интеллектуальный анализ и т. Д.) И особенно для объектов, которые действительно нужны только в течение определенного периода времени на веб-сайте, пока пользователь не завершит конкретный процесс (намного проще определить неправильное использование переменных и сохранить ресурсы после завершения процесса, но сеанс будет продолжен).