【问题标题】:ASP.NET; Several session variables or a "container object"?ASP.NET;几个会话变量或“容器对象”?
【发布时间】:2011-03-06 07:48:54
【问题描述】:

我有几个变量需要从一个页面发送到另一个页面... 最好的方法是什么?

一张一张发给他们:

string var1 = Session["var1"] == null ? "" : Session["var1"].ToString();
int var2 = Session["var2"] == null ? 0 : int.Parse(Session["var2"].ToString());

等等……

或者将它们全部放在某种容器对象中?

struct SessionData
{
    public int Var1 { get; set; }
    public string Var2 { get; set; }
    public int Var3 { get; set; }
}

--

SessionData data = Session["data"] as SessionData;

什么是最好的解决方案?你用什么?

【问题讨论】:

  • 5 分钟内有 5 个答案...我喜欢这样:D

标签: asp.net session session-variables


【解决方案1】:

两者的混合是最易于维护的方法。 Session 提供了一个低阻抗、灵活的键值对存储,因此不利用它是一种浪费。但是,对于始终彼此相关的复杂数据片段 - 例如,UserProfile - 拥有一个深度嵌套的对象是有意义的。

【讨论】:

  • 但是你为什么不把 userID 或 profileID 存储在 Session 中,然后使用 DB 来完成剩下的工作呢?
  • 因为这样你每次都会产生数据库命中的费用,这可以说是最慢的代码区域。
【解决方案2】:

我不认为我创建一个对象只是为了将其他对象捆绑在一个会话中进行存储,所以我可能会选择第一个选项。也就是说,如果您有大量对象需要将它们捆绑在一起以使其更易于使用,您可能需要重新检查您的架构。

【讨论】:

    【解决方案3】:

    如果您存储在 Session 中的所有数据都是相关的,那么我建议将其合并到一个对象中,就像您的第二个示例一样:

    public class UserData
    {
        public string UserName { get; set; }
        public string LastPageViewed { get; set; }
        public int ParentGroupId { get; set; }
    }
    

    然后将所有内容加载一次并为 Session 存储。

    但是,我不建议将不相关的 Session 数据捆绑到单个对象中。我会将每个单独的相关项目组分解成自己的。结果将是您提供的两种强硬方法之间的中间地带。

    【讨论】:

      【解决方案4】:

      我都用过。通常,许多会话变量名称会导致冲突的可能性,这使得集合更加可靠。确保集合内容与单一职责相关,就像对任何对象一样。 (事实上​​,业务对象是会话对象的绝佳候选者。)

      两个提示:

      将所有会话名称定义为公共静态只读变量,并使其成为在命名会话数据时仅使用这些静态变量的编码标准。

      其次,确保每个对象都标有[Serializable] 属性。如果您需要在进程外保存会话状态,这是必不可少的。

      【讨论】:

        【解决方案5】:

        我使用了一个 SessionHandler,它是一个自定义的滚动类,看起来像这样

        public static class SessionHandler
        {
            public static string UserId
            {
                get
                {
                    return Session["UserId"];
                }
                set
                {
                    Session["UserId"] = value;
                }
            }    
        }
        

        然后在我做的代码中

        var user = myDataContext.Users.Where(u => u.UserId = SessionHandler.UserId).FirstOrDefault();
        

        【讨论】:

        • 如果要使用这种方法,一定要明确数据是保存在Session中的。否则,对于该类的其他消费者来说,当 Session 被清除时,该行为会显得很奇怪。
        【解决方案6】:

        对象的一大优点:属性是强类型的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-19
          • 1970-01-01
          • 1970-01-01
          • 2012-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多