Экземпляры статического класса, уникальные для запроса или сервера в ASP.NET?

 public sealed class UserLoginSingleton
{

     UserLoginCollection _userLoginCol = new UserLoginCollection();

    UserLoginSingleton()
    {
    }

    public static UserLoginSingleton Instance
    {
        get
        {
            IDictionary items = HttpContext.Current.Items;
            if (!items.Contains("TheInstance"))
            {
                items["TheInstance"] = new UserLoginSingleton();

            }
            return items["TheInstance"] as UserLoginSingleton;
        }
    }


    public void CreateUserObj(string xmlData)
    {
        _userLoginCol = (UserLoginCollection)_xmlUtil.Deserialize(xmlData, typeof(UserLoginCollection));
    }

    public UserLoginCollection getUserObj()
    {
        return _userLoginCol;
    }
}

Использование:

Страница 1.aspx

UserLoginSingleton.Instance.CreateUserObj(xml);

Pase2.aspx:

UserLoginCollection userLoginCollection = UserLoginSingleton.Instance.getUserObj();

Следил за статьей здесь: текст ссылки

Я устанавливаю свой объект коллекции на странице 1, а затем выполняю response.redirect или щелкаю ссылку, чтобы перейти на страницу 2.aspx. Однако в моем экземпляре синглтона нет установленного мной объекта коллекции. Как сохранить объект коллекции на разных страницах в каждом сеансе?

Я знаю, что static не будет работать, поскольку каждый экземпляр будет видеть объект, и я хочу, чтобы это было индивидуально для каждого пользователя.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
1 573
5

Ответы 5

Коллекция HttpContext.Items предоставляется по запросу. Итак, в вашем случае, когда пользователь перенаправляется на page2.aspx, экземпляр, который вы создали на странице 1, исчез. Чтобы один и тот же экземпляр был доступен для разных запросов, вам необходимо использовать HttpContext.Session для хранения вашего экземпляра.

статические поля распределяются между запросами. Остерегайтесь стандартных проблем с многопоточностью!

Экземпляры HttpContext не используются совместно между запросами.

В приведенном примере он не использует никаких статических полей.

Mike Powell 12.12.2008 22:37

Верно. Если он хочет, чтобы данные были общими (что он, кажется, хочет), он должен использовать статическое поле.

Amy B 13.12.2008 01:02

Он хочет, чтобы он распределялся между запросами для каждого пользователя. Статические поля определенно нет то, что он хочет. :)

Mike Powell 16.12.2008 06:03

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

Я решил, что клиент может отправить его мне как сериализованные данные, я дал им xsd, и они отправят его мне асинхронно при входе в систему. Страница 1 получит сериализованные данные. страница входа будет регистрировать их. как только page1 получит данные, она десериализуется в мою строго типизированную коллекцию, которая, в свою очередь, будет использоваться для создания раскрывающегося списка в page2.aspx

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

для каждого входа пользователя в раскрывающийся список доступны различные варианты. пользователь 1 может иметь 10 вариантов, а пользователь 2 может иметь 200 вариантов.

Если вы пытаетесь избежать сеанса для сценария веб-фермы, я бы порекомендовал либо сервер состояний ASP.NET, либо обновление таблицы в базе данных (с ключом по идентификатору входа).

devstuff 15.12.2008 07:25

Просто чтобы указать, что ваша реализация синглтона неверна, ваш синглтон должен быть объявлен следующим образом

public sealed class Singleton
{
    static readonly Singleton instance=new Singleton();

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}

Используйте статический метод, который читает HttpSession вместо статической переменной:


public class UserLoginController
{
    public static UserLoginController Instance
    {
        get
        {
            HttpSession session = HttpContext.Current.Session;
            if (session["UserLoginController"] == null)
            {
                session["UserLoginController"] = new UserLoginController();
            }
            return session["UserLoginController"] as UserLoginController;
        }
    }
}

Другие вопросы по теме