asp.net中强类型的会话

时间:2010-01-09 22:02:58

标签: asp.net session session-state session-variables

如果已经提出这个问题,请原谅我。 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;}
    }

这也行不通(因为返回签名会相同,但返回类型会有所不同)。

是否有其他优雅的方式以更安全的方式在会话中保存/检索对象

5 个答案:

答案 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;