www.example.com中的强类型会话asp.net

gg0vcinb  于 2023-02-06  发布在  .NET
关注(0)|答案(5)|浏览(166)

如果这个问题已经被问过,请原谅我。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;} }
这将不能很好地工作(因为返回签名是相同的,但是返回类型是不同的)。
是否有其他优雅的方法,以更类型安全的方式保存/检索会话中的对象

xdyibdwo

xdyibdwo1#

要获得一种非常干净、可维护和灵活的处理Session的方法,请看post,您会惊讶地发现它是多么简单。

xfb7svmp

xfb7svmp2#

这种技术的一个缺点是,使用代码时需要知道使用什么键来存储和检索,这很容易出错,因为键需要完全正确,否则就有存储在错误位置或返回空值的风险。
我实际上使用了强类型变体,因为我知道会话中需要什么,因此可以设置 Package 类来适应。我宁愿在会话类中使用额外的代码,而不必担心其他地方的键字符串。

qpgpyjmq

qpgpyjmq3#

你可以简单地为你的会话对象使用单例模式,这样你就可以从一个单一的复合结构对象来建模你的整个会话。这篇文章引用了我所谈论的内容,并讨论了作为弱类型对象的会话对象:http://allthingscs.blogspot.com/2011/03/documenting-software-architectural.html

pcww981p

pcww981p4#

实际上,如果你想要类型化对象,把类型放在方法层,如下所示:

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 { .. } }
}

这是静态工厂实现,但它也通过内部对会话管理器类的静态引用来维护单点联系。会话管理器中的每个方法都可以 Package 现有的ASP.NET会话,或者使用您自己的内部存储。

zi8p0yeb

zi8p0yeb5#

我发布了一个关于StackOverflow问题的解决方案,为会话值的键名创建一个枚举是个好主意吗?
我认为它真的很光滑,包含很少的代码来实现它。它需要. net 4. 5才是最光滑的,但在旧版本中仍然是可能的。
它允许:

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

工作原理如下:

int myInt = (int)Session["MyInt"];
Session["MyInt"] = 3;

相关问题