static class instances unique to a request or a server in ASP.NET?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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
1 | UserLoginSingleton.Instance.CreateUserObj(xml); |
PASE2.ASPX:
UserLoginCollection
userLoginCollection =
UserLoginSingleton.Instance.getUserObj();
文章如下:链接文本
我在第1页中设置了集合对象,然后执行response.redirect或单击link以转到第2.aspx页。但是,我的singleton实例没有我设置的集合对象。如何在每个会话的不同页面上持久化集合对象?
我知道Static不会工作,因为每个实例都会看到对象,我希望它针对每个用户。
使用读取httpsession而不是静态变量的静态方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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; } } } |
为了指出单例实现是错误的,应该这样声明单例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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; } } } |
也许我需要重新考虑我想做什么。基本上,我的集合是一个关于下拉列表中不同值的集合。这是由客户端提供的,我的网页需要显示它。
我想客户机可以将它作为序列化数据发送给我,我给了他们XSD,他们在登录时会异步地发送给我。第1页将接收序列化数据。登录页面会将他们登录。一旦page1接收到数据,它就会反序列化到我的强类型集合中,而我的强类型集合又将用于在page2.aspx中构建下拉列表。
我为什么要这么原始地做呢?我的手被限制所束缚,如果我能避免这个对象,我就不想用会话状态来保存它。
每个用户登录都有下拉列表的各种选项。用户1 CAAN有10个选项,用户2可以有200个选项。
静态字段在请求之间共享。注意标准的多线程问题!
请求之间不共享httpContext实例。