asp.net中的请求级单例对象

时间:2013-08-29 04:49:01

标签: asp.net multithreading singleton httpcontext

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

1 个答案:

答案 0 :(得分:1)

除了我无法理解为什么你需要将用户信息从Session容器中复制到Items容器之外,你的问题的答案应该是 - 是的,如果Session数据是正确的那么您的静态属性可以获得相同的数据。

我曾经写过一篇博客文章

http://netpl.blogspot.com/2010/12/container-based-pseudosingletons-in.html