【问题标题】:How can I maintain shared state in a Windows Forms app in a way like Session in ASP.NET?如何以 ASP.NET 中的 Session 之类的方式在 Windows 窗体应用程序中维护共享状态?
【发布时间】:2012-03-03 15:06:48
【问题描述】:

如何在应用程序中的所有对象之间共享“全局”应用程序级上下文数据。我正在考虑当前登录的用户记录、用户打开哪个分支以进行会话等。如何使这些信息可用于我的所有表单以及它们用于业务逻辑服务的类?

仅仅拥有一个大的全局单例 AppContext 对象对我没有吸引力,但我现在想不出其他任何东西。也许扩展 Application 类来为所有表单提供上下文服务?我已经有一段时间没有在桌面应用程序上工作了,并且开始依赖例如ASP.NET 中永远存在的 Session 对象。

【问题讨论】:

    标签: .net winforms


    【解决方案1】:

    我认为浏览器“会话”的概念是为了跨浏览器请求维护状态而发明的。对于桌面应用程序来说,这真的不是问题。您可以使用有关用户的信息定义一个类型化的类:id、电子邮件、姓名等。基本上您将在会话中存储的任何内容。当有人登录时,创建一个新实例并将其分配给一个静态变量。当他们注销时,将静态变量设置为 null。

    如果您希望它的行为更像 HttpSessionState(任意键/值对),请将您的类型化类替换为 Hashtable。

    编辑

    根据您计划在会话中保留的内容,我的答案可能会有所不同,但这是我很快想到的一个类似单例的课程。

    public class AppContext
    {
        private static AppContext current;
    
        // reference to the current app context
        public static AppContext Current
        {
            get { return current; }
        }
    
        // prevents new instance from being created externally
        private AppContext() { }
    
        // call when a user logs in
        public static void Login(AppUser user)
        {
            current = new AppContext()
            {
                ApppUser = user
            };
        }
    
        // call when a user logs out
        public static void Logout()
        {
            current = null;
        }
    
        // reference to the logged in user
        public AppUser User
        {
            get;
            private set;
        }
    
        public String FooString
        {
            get;
            set;
        }
    
        public int? FooInt
        {
            get;
            set;
        }
    
        public ComplexType FooClass
        {
            get;
            set;
        }
    
        public IList<Foo> ListOfFoo
        {
            get;
            set;
        }
    
        // ***** DEFINE ADDTL PARAMETERS HERE AS NEEDED *****
    }
    

    您可以通过应用程序中的任何表单轻松引用AppContext.Current。我不确定这是否完全回答了您的问题,但这是我的第一种方法。

    【讨论】:

    • 在什么类上定义这样一个静态变量,这是我的主要问题。
    【解决方案2】:

    服务器-客户端应用程序,例如基于 Web 的应用程序,必须处理跨网络的数据交换,这涉及到大量的序列化和反序列化以及用于识别用户上下文的密钥(例如会话 ID、客户端 ID、 ETC)。

    在 WinForms 中,所有对象都在内存中,随时可以访问。这既简单又高效,如果需求不强迫我,我不会让它变得更复杂。

    AppContext 单例对我来说似乎是完全合理的,如果多个窗口要同时命中,请注意线程安全问题。

    【讨论】:

    • 我意识到了这些差异,是的,我可以将对象存储在内存中,以延长应用程序的生命周期,但我的疑问/问题来自何处,而不是如何。好的,所以也许只有这一个单身人士,只有一次。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2011-11-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多