2008-12-12 2 views
4
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; 
    } 
} 

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

страница 1.aspx

UserLoginSingleton.Instance.CreateUserObj(xml); 

Pase2.aspx:

UserLoginCollection userLoginCollection = UserLoginSingleton.Instance.getUserObj();

Вслед за статью здесь: link text

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

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

ответ

3

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

0

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

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

+0

В Например, он не использует статические поля. – 2008-12-12 19:37:19

+0

Справа. Если он хочет, чтобы данные делились (что, по-видимому, ему кажется), он должен использовать статическое поле. – 2008-12-12 22:02:09

0

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

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

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

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

0

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

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; 
     } 
    } 
} 
0

Используйте статический метод, который считывает 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; 
     } 
    } 
} 

Смежные вопросы