我试图编写一种伪单例实现。我希望它的工作方式与工作方式类似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 请求相关联的其他用户?