none
Создание глобальных классов. RRS feed

  • Вопрос

  • Описание задачи.

           Нужно создать класс (глобальный), который будет инициализироваться один раз  на мастер-странице и какждый дочерний контрол мастер страниц

    (WebPage, UserControl) будет иметь доступ к этому обьекту.

    Требования к классу:

        1. Обьект создается каждый раз при обращении к странице.

        2. Каждому пользователю отдается свой уникальный обьект.

    (В этом обьекте хранится критическая для каждого пользователя информация.)

     

    Мое решение (как оказалось не совсем правильное)

     

     

     

      <pre> public class GlobalSiteWork
      {
        public void Initialize()
        {
          //Do something(). 
        }
        public static GlobalSiteWork Instance
        {
          get
          {
            if (_instance == null)
            {
              _instance = new GlobalSiteWork();
              _instance.Initialize();
            }
            return _instance;
          }
          set{ _instance = value;}
        }
        private static GlobalSiteWork _instance;
      }
    

     

    И вызываю его в методе Pre_Init мастер страницы.

      protected void Page_Init(object sender, EventArgs e) 
      { 
        GlobalSiteWork.Instance = new GlobalSiteWork(); 
        GlobalSiteWork.Instance.Initializee(); 
      }
    
    

    Но при установке на сайт он начал время от времени отдавать мне неправильные данные.

    Допустим у нас в этом классе есть переменная T булевского типа (обьвленна она так public bool T = false; ) и метод SetT();, которая ее устанавливает в true.

     Когда мы на какой-то странице делаем что-то типа такого.

      GlobalSiteWork.Instance.SetT();        
      GlobalSiteWork.Instance.DoSomething();<br/>
    
    

    Переменная T в методе DoSomething() должна быть true но время от времени она бывает в false.

    В связи с этим у меня несколько вопросов.

      1) Что я делаю не так?

      2) Если я делаю координально все нетак. Подскажите наиболее приемлимы способ для моей ситуации.

    Спасибо.

     

     

     

     

     

     

     

    24 декабря 2010 г. 13:11

Ответы

  • Простите, не доглядел))

    Получается у вас всего один объект на всех пользователей, хоть и с каждым пользователем он заново создается, но он один же, поэтому между вызовами setT и doSomething какой-либо пользователь обновил страницу и объект пересоздался. Я б посоветовал держать один объект и создавать его единожды, а в нем хранить, например, SortedList с ключом ID пользователя, который будет хранить в себе объекты для каждого пользователя свой, а при обновлении страницы скидывать объект для конкретного пользователя.

    24 декабря 2010 г. 14:44

Все ответы

  • уберите из masterPage

    GlobalSiteWork.Instance = new GlobalSiteWork(); 
    GlobalSiteWork.Instance.Initializee(); 
    
    т.к. вы создаете объект каждый раз заново, а нужно только раз, и этот раз будет при первом обращении к GlobalSiteWork.Instance (в gete объект сам создастся тот самый единственный раз, а в sete я б вообще убрал присвоение, чтоб не затиреть объект).

     

    24 декабря 2010 г. 14:01
  • Здесь не подойдет  паттерн синглтон. Ниже опишу почему.

     

     

    уберите из masterPage

     

    GlobalSiteWork.Instance = new GlobalSiteWork(); 
    GlobalSiteWork.Instance.Initializee(); 
    
    
      т.к. вы создаете объект каждый раз заново, а нужно только раз, и этот раз будет при первом обращении к GlobalSiteWork.Instance (в gete объект сам создастся тот самый единственный раз, а в sete я б вообще убрал присвоение, чтоб не затиреть объект).
    В этом случае для всех пользователей будет одинаковый обьект. а как я описал в теме и на каждой странице он будет один и тот же пока он не уберется сборщиком месора и не создасться новый. 
    А мне нужно чтобы обьект создавался каждый раз при обращении к странице и каждому пользователю отдается свой уникальный обьект. По этой же причине нам не подойдет паттерн синглтон.

     

     

     

     

     


    24 декабря 2010 г. 14:14
  • Простите, не доглядел))

    Получается у вас всего один объект на всех пользователей, хоть и с каждым пользователем он заново создается, но он один же, поэтому между вызовами setT и doSomething какой-либо пользователь обновил страницу и объект пересоздался. Я б посоветовал держать один объект и создавать его единожды, а в нем хранить, например, SortedList с ключом ID пользователя, который будет хранить в себе объекты для каждого пользователя свой, а при обновлении страницы скидывать объект для конкретного пользователя.

    24 декабря 2010 г. 14:44