6

如果这个问题已经被问过,请原谅我。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)并转换objt并返回。

    public class SessionObject { public Type type {get;set;} public Object obj{get;set;}
    }

这将无法正常工作(因为返回签名将相同,但返回类型将不同)。

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

4

5 回答 5

4

对于处理 Session 的一种非常干净、可维护和巧妙的方式,请查看这篇文章。你会惊讶于它是多么简单。

于 2010-01-10T19:46:27.953 回答
2

该技术的一个缺点是使用代码需要知道使用什么键来存储和检索。这很容易出错,因为密钥需要完全正确,否则您可能会存储在错误的位置,或者返回空值。

我实际上使用了强类型变体,因为我知道我需要在会话中拥有什么,因此可以设置适合的包装类。我宁愿在会话类中有额外的代码,而不必担心其他任何地方的键字符串。

于 2010-01-11T06:44:13.770 回答
2

您可以简单地为会话对象使用单例模式。这样,您可以从单个复合结构对象对整个会话进行建模。这篇文章指的是我正在谈论的内容,并将 Session 对象作为弱类型对象进行讨论:http: //allthingscs.blogspot.com/2011/03/documenting-software-architectural.html

于 2011-03-25T22:51:26.353 回答
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 会话,或者使用您自己的内部存储。

于 2010-01-10T05:49:44.880 回答
0

我在 StackOverflow 问题上发布了一个解决方案,为会话值的键名创建一个枚举是个好主意吗?

我认为它真的很漂亮,并且包含很少的代码来实现它。它需要 .NET 4.5 是最流畅的,但仍然可以使用旧版本。

它允许:

int myInt = SessionVars.MyInt; 
SessionVars.MyInt = 3;

完全像:

int myInt = (int)Session["MyInt"];
Session["MyInt"] = 3;
于 2015-03-19T14:19:26.853 回答