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;
}
}
用法:
Page 1.aspx
UserLoginSingleton.Instance.CreateUserObj(xml);
Pase2.aspx:
UserLoginCollection userLoginCollection = UserLoginSingleton.Instance.getUserObj();
点击这篇文章: link text
我在第1页设置了我的集合对象,然后执行response.redirect或点击链接以获取第2.aspx页。但是,我的单例实例没有设置的集合对象。如何在每个会话中跨多个页面保留我的集合对象?
我知道静态不会起作用,因为每个实例都会看到对象,我希望每个用户都能看到它。
答案 0 :(得分:3)
HttpContext.Items
集合是按请求的。因此,在您将用户重定向到page2.aspx的情况下,您在第1页上创建的实例已消失。要使相同的实例可以跨请求使用,您需要使用HttpContext.Session
来存储您的实例。
答案 1 :(得分:0)
静态字段在请求之间共享。注意标准的多线程问题!
请求之间不共享HttpContext实例。
答案 2 :(得分:0)
也许我需要重新思考我想做的事情。基本上我的集合是围绕下拉列表的不同值的集合。这是由客户提供的,我的网页需要显示它。
我认为客户端可以将它作为序列化数据发送给我,我给了他们xsd,他们会在登录时异步发送给我。第1页将收到序列化数据。登录页面将登录。一旦page1收到数据,将反序列化为我的强类型集合,反过来将用于在page2.aspx中构建下拉列表
为什么我以这种原始的方式做这件事。我的双手被限制捆绑,我试图不使用会话状态来保存这个对象,如果我可以避免它。
每个用户登录都有下拉列表的各种选项。 user 1 caan有10个选项,user 2可以有200个选项。
答案 3 :(得分: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;
}
}
}
答案 4 :(得分: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;
}
}
}