Просто хочу убедиться, что я не предполагаю что-то глупо здесь, при реализации шаблона singleton в веб-приложении ASP.NET. Статическая переменная scope предназначена только для текущего сеанса пользователя, верно? Если второй пользователь обращается к сайту, это другая область памяти...?
ASP.NET Singleton
Ответ 1
Область статической переменной предназначена для всего домена приложения, что означает, что другие сеансы также имеют к ней доступ. Только если у вас есть ферма с разными серверами, у вас будет более одного экземпляра переменной.
Ответ 2
Статические члены имеют только область текущего рабочего процесса, поэтому он не имеет ничего общего с пользователями, поскольку другие запросы не обязательно обрабатываются одним и тем же рабочим процессом.
- Чтобы обмениваться данными с конкретным пользователем и между запросами, используйте HttpContext.Current.Session.
- Чтобы обмениваться данными в рамках конкретного запроса, используйте HttpContext.Current.Items.
- Для обмена данными по всему приложению либо создайте механизм для этого, либо настройте IIS для работы с одним процессом и напишите одноэлементное/используемое приложение.
Кстати, число рабочих процессов по умолчанию равно 1, поэтому именно поэтому в сети полно людей, которые думают, что статические члены имеют область действия всего приложения.
Ответ 3
Как уже упоминалось, статическая переменная глобальна для всего приложения, а не для отдельных запросов.
Чтобы сделать singleton global только для отдельных запросов, вы можете использовать словарь HttpContext.Current.Items
.
public class Singleton
{
private Singleton() { }
public static Singleton Instance
{
get
{
if (HttpContext.Current.Items["yourKey"] == null)
HttpContext.Current.Items["yourKey"] = new Singleton();
return (Singleton)HttpContext.Current.Items["yourKey"];
}
}
}
Ответ 4
Если вам нужно, чтобы он был пользователем или сеансом, проверьте следующую ссылку. В противном случае, как сказал Отавио, синглтон доступен для всего домена.
Ответ 5
Синглтон используется для всего домена приложения, если вы хотите хранить данные, связанные с сеансом пользователя, используйте HttpContext Session, который предназначен для этой цели. Разумеется, вам, вероятно, придется перепроектировать структуру вашего класса, чтобы иметь возможность использовать способ пары "ключ-значение" для обработки данных, с которыми вы пытаетесь работать.
Ответ 6
Сессия для всего приложения для каждого пользователя. ViewState для отдельной страницы asp.