单例模式ASP.NET C#针对每个用户

3
我正在使用ASP.NET C#构建一个Web应用程序,我有一个类想在多个页面中使用而不必每次都实例化它。我需要在其中加载数据并在用户会话期间永不丢失。我考虑过单例模式,但它在浏览器之间共享类的实例。我该如何解决这个问题?

1
根据定义,这不是单例模式。 - San Jacinto
3个回答

9

1
如果需要确保可重入调用只生成类/对象的单个实例,则Singleton 可能是答案。除非OP正在使用线程或某种并发代码运行方法来进行单个用户会话,否则不一定需要严格执行此操作。 - GrayWizardx
我必须为每个打开页面的用户只有一个类实例。我的问题是,使用单例模式和静态实例会在用户之间共享数据,包括浏览器。 - Stefano
1
@Stefano 如果你使用session,就可以实现你想要的。数据只在所有页面和session的生命周期内存在一个实例。但是,如果相同的用户从不同的计算机或不同的浏览器登录,则会失败。 - Chuck Conway

1
UserData data = new UserData(somedata);

Session["UserData"] = data;

下一页
UserData data = (UserData) Session["UserData"];

1
如果您使用的是 inproc 会话状态,您可以使用类似于以下的代码:
class Singleton
{
    static object locker = new Object();

    public static Singleton Instance
    {
        get
        {
            var inst = HttpContext.Current.Session["InstanceKey"] as Singleton;
            if (inst == null)
            {
                lock (locker)
                {
                    inst = HttpContext.Current.Session["InstanceKey"] as Singleton;
                    if (inst == null)
                    {
                        inst = new Singleton();
                        HttpContext.Current.Session["InstanceKey"] = inst;
                    }
                }
            }
            return inst;
        }
    }
}

代码可以改进,以避免所有用户被锁定。不确定实现单例模式是否是一个好主意,建议您看看是否可以用其他方式设计您的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接