asp.net中的强类型会话
如果已经有人问过这个问题,请原谅asp.net中的强类型会话,asp.net,session,session-state,session-variables,Asp.net,Session,Session State,Session Variables,如果已经有人问过这个问题,请原谅HttpContext.Current.Session[“key”]返回一个对象,我们必须将其强制转换为特定的类型才能使用它。我正在研究类型化会话的各种实现 我觉得如果我们想在会话中添加一个新的类型的对象,我们需要在SessionManager中添加更多的代码(如果我错了,请纠正我),无论是作为一个方法还是作为一个单独的包装器。我想我们可以用仿制药 public static class SessionManager<T> where T:clas
HttpContext.Current.Session[“key”]
返回一个对象,我们必须将其强制转换为特定的类型才能使用它。我正在研究类型化会话的各种实现
我觉得如果我们想在会话中添加一个新的类型
的对象,我们需要在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[“sessionString”]=objtostreasion
,
但是发现静态类不能有索引器。有没有其他方法可以做到这一点
- 我的想法是创建一个SessionObject,它将存储
类型和对象,然后使用键将该对象添加到Session(使用SessionManager)。检索时,将所有对象强制转换为SessionObject
,获取类型(比如t)和对象(比如obj),并将obj
强制转换为t
,然后返回它
公共类SessionObject
{
公共类型类型{get;set;}
公共对象obj{get;set;}
}
这将不起作用(因为返回签名将是相同的,但返回类型将不同)
是否有其他优雅的方式以更安全的方式保存/检索会话中的对象实际上,如果要键入对象,请将类型放在方法级别,如:
public T GetValue<T>(string sessionKey)
{
}
这是静态工厂实现,但它也通过对会话管理器类的静态引用在内部维护一个单点联系。sessionmanager中的每个方法都可以包装现有的ASP.NET会话,或者使用您自己的内部存储。要获得一种非常干净、可维护且灵活的会话处理方法,请参阅此。您会惊讶于它的简单程度。该技术的一个缺点是,使用代码时需要知道存储和检索所使用的键。这很容易出错,因为密钥需要完全正确,否则可能会存储在错误的位置,或者返回空值
我实际上使用了强类型变体,因为我知道会话中需要什么,因此可以设置包装类来适应。我宁愿在session类中有额外的代码,也不必担心其他地方的键字符串。您可以简单地为会话对象使用单例模式。这样,您就可以从单个复合结构对象对整个会话进行建模。这篇文章引用了我正在谈论的内容,并将会话对象作为弱类型对象进行了讨论:我发布了一个关于StackOverflow问题的解决方案
我认为它非常流畅,包含的代码很少。它需要.NET4.5是最流畅的,但在旧版本中仍然是可能的
它允许:
int myInt = SessionVars.MyInt;
SessionVars.MyInt = 3;
完全按照以下方式工作:
int myInt = (int)Session["MyInt"];
Session["MyInt"] = 3;
尽管这是一篇很好的文章,但从特定于会话的类派生类不会让您从任何其他抽象类/基类派生类class@Ram是的,在我的帖子中,类的要点是它是您希望在会话中存储的任何项目的包装器。正如我希望你们注意到的,这真的是再容易不过了。它真的能在进程外工作吗?因为会话对象永远不会写回会话存储,所以会话存储中仍将包含以前序列化的旧值。@回答中的链接似乎已失效。是的,同意您的说法。我认为为会话字符串设置SessionManager.Constants是一种标准实现,可以避免输入错误
int myInt = SessionVars.MyInt;
SessionVars.MyInt = 3;
int myInt = (int)Session["MyInt"];
Session["MyInt"] = 3;