我试着编写一种伪单例实现。我希望它的工作方式与HttpContext
的工作方式类似,我可以在上下文中为实例创建一个简单的实例:
var ctx = HttpContext.Current;
所以我的实现是这样的:
public class AppUser
{
public string Username { get; set; }
public string[] Roles { get; set; }
public AppUser()
{
var appuser = HttpContext.Session["AppUser"] as AppUser;
if(appuser == null)
throw new Exception("User session has expired");
Username = appuser.Username;
Roles = appuser.Roles;
}
}
public class WebAppContext
{
const string ContextKey = "WebAppContext";
WebAppContext() { } //empty constructor
public static WebAppContext Current
{
get
{
var ctx = HttpContext.Current.Items[ContextKey] as WebAppContext;
if(ctx == null)
{
try
{
ctx = new WebAppContext() { User = new AppUser() };
}
catch
{
//Redirect for login
}
HttpContext.Current.Items.Add(ContextKey, ctx);
}
return ctx;
}
}
public AppUser User { get; set; }
}
我尝试按如下方式使用此对象:
var appuser = WebAppContext.Current.User;
现在,以上行确保我获得与正确请求上下文关联的用户;不是与正在处理的另一个并发http请求相关联的其他用户吗?
答案 0 :(得分:1)
除了我无法理解为什么你需要将用户信息从Session容器中复制到Items容器之外,你的问题的答案应该是 - 是的,如果Session数据是正确的那么您的静态属性可以获得相同的数据。
我曾经写过一篇博客文章
http://netpl.blogspot.com/2010/12/container-based-pseudosingletons-in.html