【问题标题】:Singleton-Pattern ASP.NET C# for each user每个用户的单例模式 ASP.NET C#
【发布时间】:2010-09-16 16:28:37
【问题描述】:

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

【问题讨论】:

  • 根据定义,这不是单例模式。

标签: c# asp.net singleton design-patterns


【解决方案1】:

单例不是答案。看看Session StateViewStateCookies

【讨论】:

  • Singleton 可能是他的答案,如果他需要保证可重入调用只生成类/对象的单次使用。除非 OP 使用线程或其他方法为单个用户会话运行并发代码,否则这不是严格需要的
  • 对于打开页面的每个用户,我必须只有一个类的实例。我的问题是,通过单例模式和静态实例,我在用户和浏览器之间共享数据
  • @Stefano 如果您使用会话,您可以实现您想要的。跨页面和会话生命周期中只有一个数据实例。但是,如果同一用户从不同的计算机或不同的浏览器登录,这将失败。
【解决方案2】:
UserData data = new UserData(somedata);

Session["UserData"] = data;

下一页

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

【讨论】:

    【解决方案3】:

    如果你有 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是否是个好主意,我建议你看看你是否可以用其他方式设计你的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2013-07-01
      • 2014-06-05
      • 2023-03-20
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多