如果这个问题已经被问过,请原谅我。HttpContext.Current.Session["key"]
返回一个对象,我们必须将它强制转换为特定的Type
,然后才能使用它。
http://www.codeproject.com/KB/aspnet/typedsessionstate.aspxhttp://weblogs.asp.net/cstewart/archive/2008/01/09/strongly-typed-session-in-asp-net.aspxhttp://geekswithblogs.net/dlussier/archive/2007/12/24/117961.aspx
我觉得如果我们想在会话中添加一个新的Type
对象,无论是作为一个方法还是作为一个单独的 Package 器,都需要在SessionManager中添加更多的代码(如果我说错了请纠正我)。
public static class SessionManager<T> where T:class
{
public void SetSession(string key,object objToStore)
{
HttpContext.Current.Session[key] = objToStore;
}
public T GetSession(string key)
{
return HttpContext.Current.Session[key] as T;
}
}
- 是否有任何固有的优势使用
SessionManager<ClassType>.GetSession("sessionString")
而不是使用
HttpContext.Current.Session["sessionString"] as ClassType
- 我也在想如果能有个
SessionManager["sessionString"] = objToStoreInSession
,但发现静态类不能有索引器,有没有其他方法可以实现呢?
- 我的想法是创建一个存储
Type
和对象的SessionObject,然后将这个对象添加到Session(使用SessionManager),键为.检索时,将所有对象转换为SessionObject
,获取类型(比如t)和对象(比如obj),将obj
转换为t
并返回.
public class SessionObject { public Type type {get;set;} public Object obj{get;set;} }
这将不能很好地工作(因为返回签名是相同的,但是返回类型是不同的)。
是否有其他优雅的方法,以更类型安全的方式保存/检索会话中的对象
5条答案
按热度按时间xdyibdwo1#
要获得一种非常干净、可维护和灵活的处理Session的方法,请看post,您会惊讶地发现它是多么简单。
xfb7svmp2#
这种技术的一个缺点是,使用代码时需要知道使用什么键来存储和检索,这很容易出错,因为键需要完全正确,否则就有存储在错误位置或返回空值的风险。
我实际上使用了强类型变体,因为我知道会话中需要什么,因此可以设置 Package 类来适应。我宁愿在会话类中使用额外的代码,而不必担心其他地方的键字符串。
qpgpyjmq3#
你可以简单地为你的会话对象使用单例模式,这样你就可以从一个单一的复合结构对象来建模你的整个会话。这篇文章引用了我所谈论的内容,并讨论了作为弱类型对象的会话对象:http://allthingscs.blogspot.com/2011/03/documenting-software-architectural.html
pcww981p4#
实际上,如果你想要类型化对象,把类型放在方法层,如下所示:
如果会话中有相同的对象,那么类级别就更多了,但是会话可以扩展为多种类型。我只想让它做它已经做了一段时间的事情,并简单地提供一种以更强类型的方式提取和保存信息的方法(至少对消费者来说)。
是的,索引不起作用;您可以将其创建为示例,并通过以下方式使其成为静态:
这是静态工厂实现,但它也通过内部对会话管理器类的静态引用来维护单点联系。会话管理器中的每个方法都可以 Package 现有的ASP.NET会话,或者使用您自己的内部存储。
zi8p0yeb5#
我发布了一个关于StackOverflow问题的解决方案,为会话值的键名创建一个枚举是个好主意吗?
我认为它真的很光滑,包含很少的代码来实现它。它需要. net 4. 5才是最光滑的,但在旧版本中仍然是可能的。
它允许:
工作原理如下: