Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对每个用户的单例模式ASP.NET C#_C#_Asp.net_Singleton_Design Patterns - Fatal编程技术网

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

针对每个用户的单例模式ASP.NET C#,c#,asp.net,singleton,design-patterns,C#,Asp.net,Singleton,Design Patterns,我正在用asp.net c#构建一个web应用程序,我有一个类,我想在多个页面中使用它,而不是每次都实例化它。我需要加载其中的数据,并且在用户会话期间永远不会丢失它们。我考虑过单例模式,但它在浏览器之间共享了类的实例。我怎样才能解决这个问题?单例不是答案。看看,然后 下一页 UserData data = (UserData) Session["UserData"]; 如果您有inproc会话状态,您可以使用类似的东西 class Singleton { static object l

我正在用asp.net c#构建一个web应用程序,我有一个类,我想在多个页面中使用它,而不是每次都实例化它。我需要加载其中的数据,并且在用户会话期间永远不会丢失它们。我考虑过单例模式,但它在浏览器之间共享了类的实例。我怎样才能解决这个问题?

单例不是答案。看看,然后

下一页

UserData data = (UserData) Session["UserData"];

如果您有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;
        }
    }
}

可以改进代码,以避免对所有用户进行锁定。我不知道这样实现Singleton是否是一个好主意,我建议您看看是否可以用其他方式设计代码。

如果Singleton需要强调可重入调用只生成类/对象的一次使用,那么Singleton可能是答案。除非OP使用线程或其他为单个用户运行并发代码的方法,否则严格来说,这是不需要的。对于打开页面的每个用户,必须只有一个类实例。我的问题是,使用单例模式和静态实例,我在用户之间共享数据,等等browsers@Stefano如果你使用一个会话,你可以实现你想要的。在整个页面和会话生命周期内,只有一个数据实例。但是,如果同一用户从不同的计算机或不同的浏览器登录,这将失败。根据定义,这不是单例模式。
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;
        }
    }
}