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

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

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

这会带来一个问题 - 在将来的某个时候,我的应用程序将拥有一个显然无法引用Web会话状态的Windows客户端。所以我需要一个主机或自定义会话类,我可以在我的业务层中引用该类,它不知道应用程序是在Web还是桌面上运行。类似的东西:

IHost.User.Info

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

帮助表示感谢。

有帮助吗?

解决方案

假设业务层是一个单独的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;
      }
   }
}

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top