1

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

4

1 回答 1

1

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

我曾经写过一篇博客文章

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

于 2013-08-31T14:54:51.537 回答