如何在ASP.NET窗体中以Session的方式维护Windows窗体应用程序中的共享状态?

问题描述:

如何在应用程序中的所有对象之间共享“全局”应用程序级上下文数据。我正在考虑当前登录的用户记录,用户打开哪个分支进行会话等。我如何使这些信息适用于我所有的表单以及他们用于业务逻辑服务的类?如何在ASP.NET窗体中以Session的方式维护Windows窗体应用程序中的共享状态?

只有一个大的全局单例AppContext对象不会吸引我,但我现在不能想到其他任何东西。也许扩展Application类以向所有表单提供上下文服务?我有一段时间没有在桌面应用上工作过,并且已经开始依赖于ASP.NET中永远存在的Session对象。

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

如果您希望它的行为更像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。我不确定这是否能回答你的问题,但这将是我的第一个方法。

+0

在我要定义这样一个静态变量的类是我的主要问题。 – ProfK 2012-03-03 17:38:49

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

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

一个AppContext单身对我来说似乎是完全合理的,只要注意几个窗口同时打开时的线程安全问题。

+0

我意识到了这些差异,是的,我可以将对象存储在内存中,以延长应用程序的使用寿命,但是我的疑惑/问题来自哪里,而不是如何。好吧,那么也许只是这一个单身人士,然后只是一次。 :-) – ProfK 2012-03-03 17:41:08