2

我有一个 Web 应用程序,它大量使用会话状态来存储有关当前用户、他们的个人设置、记录他们的会话历史等的信息。

我发现自己在业务层中检索此会话信息,如下所示:

((UserSession)HttpContext.Current.Session["UserSession"]).User.Info

这带来了一个问题——在未来的某个时候,我的应用程序将有一个 Windows 客户端,它显然无法引用 Web 会话状态。因此,我需要一个可以在业务层中引用的主机或自定义会话类,它与应用程序是在 Web 上运行还是在桌面上运行无关。就像是:

IHost.User.Info

在幕后,Web 实现显然会利用 Session 状态来存储信息,但我需要将其隐藏在业务层之外。有没有人解决了这个问题或得到任何关于如何最好地解决这个问题的实用建议?

帮助表示赞赏。

4

3 回答 3

2

假设业务层是一个单独的 DLL,我永远不会添加对对象的引用System.Web,因此我永远不会Session直接使用该对象。这将导致业务层和客户端(Web 或 Winforms)的公开接口的不同设计。

也就是说,作为一种快速解决方法,我建议在您的业务层中编写一个包装类,以隐藏Session您的代码中的对象。您的代码调用将是这样的:

((UserSession) DualContext.Current["UserSession"]).User.Info

并且包装器实现将是这样的(未完成和测试):

public class DualContext 
{
   private Dictionary<string, object> winFormsSession = new Dictionary<string, object>();
   private static readonly DualContext instance = new DualContext();

   public static DualContext Current
   {
      get {  return instance; }
   }

   public object this[string key]
   {
      get 
      {
         if (HttpContext.Current != null)
            return HttpContext.Current.Session[key];
         else
            return winFormsSession[key];
      }
      set 
      {
         if (HttpContext.Current != null)
            HttpContext.Current.Session[key] = value;
         else
            winFormsSession[key] = value;
      }
   }
}
于 2008-10-25T14:08:45.813 回答
2

这需要重新设计架构,但如果您从使用会话状态切换到用户配置文件,则可以使用客户端应用程序服务来共享信息。

http://msdn.microsoft.com/en-us/library/bb384297.aspx

于 2008-10-25T14:47:02.773 回答
-2

我猜你需要创建一个 web 服务或 RESTfull 服务。该服务将返回一个表示您的用户信息的 XML 文件。您将能够从您的 Windows 或 Web 应用程序调用该服务。

于 2008-10-25T13:04:41.180 回答