如果已经提出这个问题,请原谅我。 HttpContext.Current.Session["key"]
返回一个对象,我们必须先将其强制转换为特定的Type
才能使用它。我正在研究类型会话的各种实现
http://www.codeproject.com/KB/aspnet/typedsessionstate.aspx http://weblogs.asp.net/cstewart/archive/2008/01/09/strongly-typed-session-in-asp-net.aspx http://geekswithblogs.net/dlussier/archive/2007/12/24/117961.aspx
如果我们想要将一个新的Type
对象添加到会话中,我觉得我们需要在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
,
但发现静态类不能有索引器。还有其他方法可以达到这个目的吗?
我的想法是创建一个SessionObject,它将存储Type
和对象,然后使用密钥将此对象添加到Session(使用SessionManager)。检索时,将所有对象强制转换为SessionObject
,获取类型(比方说t)和对象(比如说obj)并将obj
转换为t
并返回。
public class SessionObject
{
public Type type {get;set;}
public Object obj{get;set;}
}
这也行不通(因为返回签名会相同,但返回类型会有所不同)。
是否有其他优雅的方式以更安全的方式在会话中保存/检索对象
答案 0 :(得分:4)
对于处理Session的非常干净,可维护和灵活的方式,请查看此post。你会惊讶它有多么简单。
答案 1 :(得分:2)
该技术的缺点是消费代码需要知道用于存储和检索的密钥。这可能容易出错,因为密钥需要完全正确,否则您可能会冒险存储在错误的位置,或者返回空值。
我实际上使用强类型变体,因为我知道我需要在会话中拥有什么,因此可以设置包装类以适应。我宁愿在会话类中使用额外的代码,也不必担心其他任何地方的密钥字符串。
答案 2 :(得分:2)
您可以简单地为会话对象使用单例模式。这样,您就可以从单个复合结构对象建模整个会话。这篇文章引用了我所说的内容,并将Session对象作为弱类型对象进行讨论:http://allthingscs.blogspot.com/2011/03/documenting-software-architectural.html
答案 3 :(得分:1)
实际上,如果您要查找对象,请将类型放在方法级别,如:
public T GetValue<T>(string sessionKey)
{
}
如果在会话中具有相同的对象,则类级别更多,但会话可以扩展为多种类型。我不知道我会担心控制会话;我只是让它做了一段时间所做的事情,并简单地提供了一种以更强类型的方式提取和保存信息的方法(至少对消费者而言)。
是的,索引不起作用;您可以将其创建为实例,并通过以下方式使其成为静态:
public class SessionManager
{
private static SessionManager _instance = null;
public static SessionManager Create()
{
if (_instance != null)
return _instance;
//Should use a lock when creating the instance
//create object for _instance
return _instance;
}
public object this[string key] { get { .. } }
}
所以这是静态工厂实现,但它也通过内部对会话管理器类的静态引用维护单点联系。 sessionmanager中的每个方法都可以包装现有的ASP.NET会话,或使用您自己的内部存储。
答案 4 :(得分:0)
我在StackOverflow问题is it a good idea to create an enum for the key names of session values?
上发布了一个解决方案我认为它非常光滑并且包含很少的代码来实现它。它需要.NET 4.5才能成为最新版本,但旧版本仍然可以使用。
它允许:
int myInt = SessionVars.MyInt;
SessionVars.MyInt = 3;
完全像:
int myInt = (int)Session["MyInt"];
Session["MyInt"] = 3;