Подтвердить что ты не робот

ASP.NET Singleton

Просто хочу убедиться, что я не предполагаю что-то глупо здесь, при реализации шаблона singleton в веб-приложении ASP.NET. Статическая переменная scope предназначена только для текущего сеанса пользователя, верно? Если второй пользователь обращается к сайту, это другая область памяти...?

4b9b3361

Ответ 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

Если вам нужно, чтобы он был пользователем или сеансом, проверьте следующую ссылку. В противном случае, как сказал Отавио, синглтон доступен для всего домена.

http://samcogan.com/singleton-per-asp-net-session/

Ответ 5

Синглтон используется для всего домена приложения, если вы хотите хранить данные, связанные с сеансом пользователя, используйте HttpContext Session, который предназначен для этой цели. Разумеется, вам, вероятно, придется перепроектировать структуру вашего класса, чтобы иметь возможность использовать способ пары "ключ-значение" для обработки данных, с которыми вы пытаетесь работать.

Ответ 6

Сессия для всего приложения для каждого пользователя. ViewState для отдельной страницы asp.