如何提供在Windows和Web应用程序中使用的Session / Host对象?
-
04-07-2019 - |
题
我有一个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;
}
}
}
其他提示
需要进行一些重新架构,但如果您从使用会话状态切换到用户配置文件,则可以使用客户端应用程序服务来共享信息。
我想你需要创建一个webservice或RESTfull服务。该服务将返回表示您的用户信息的XML文件。您将能够从Windows或Web应用程序调用服务。
不隶属于 StackOverflow