【问题标题】:Wrapping session handling inside the static class在静态类中包装会话处理
【发布时间】:2009-06-09 03:35:26
【问题描述】:

我将所有直接会话交互分离到一个单独的类中并将其设为静态,因为我不想多次创建新对象。但是,我希望确保没有并发问题或其他奇怪的惊喜。

代码如下:

public static class HttpHelper
{

    public static string Get(string key)
    {
        object value = HttpContext.Current.Request.QueryString[key];
        return (value == null) ? null : value.ToString();
    }


    public static string Post(string key)
    {
        object value = HttpContext.Current.Request.Form[key];
        return (value == null) ? null : value.ToString();
    }

    public static string Session(string key)
    {
        object value = HttpContext.Current.Session[key];
        return (value == null) ? null : value.ToString();
    }

    public static void ClearSession(string key)
    {
        HttpContext.Current.Session[key] = null;
    }

    public static void StoreInSession(string key, object value)
    {
        HttpContext.Current.Session[key] = value;
    }

}

【问题讨论】:

    标签: c# session httpcontext static-classes


    【解决方案1】:

    如果这有任何功能问题,许多应用程序早就失败了:)

    但是,我要指出这个模型对于单元测试不是很好。您可能需要考虑将方法设为实例成员并将 Session 提供程序传递到此 HttpHelper 对象的构造函数中。

    【讨论】:

    • 谢谢雷克斯,我可以这样做。就这个模型而言。我只是想确认会话变量不会在用户之间共享,我想确保会话对每个用户都是唯一的。
    【解决方案2】:

    这是一个类似问题的答案,可能会对您有所帮助 - 它可以让您避免使用键来完全访问会话值并为您提供类型安全的属性:

    How to access session variables from any class in ASP.NET?

    【讨论】:

    • 在这种情况下,我必须为每个 var 创建一个属性的价格,我会坚持使用键。
    • @gnomixa 你的推理似乎很奇怪。为每个会话对象创建属性的成本总是低于在字典键中打错字的成本。 “道具标签标签”完成!
    • 阅读我的 cmets 到其他答案:我将密钥存储在静态类中,因此我不输入魔术字符串。类型转换是另一回事,虽然大声笑
    【解决方案3】:

    从概念上讲,你应该没问题。即使在您可能期望竞争条件的部分回发(EG,AJAX)场景中,您也应该没问题。会话状态使用reader/writer lock 来保证您的安全。

    我倾向于在我的项目中做类似的事情,尽管我喜欢将实际有效的会话条目(键等)封装到属性中。我发现它使应用程序代码更加一致,而且——更重要的是——消除了魔术键字符串上出现拼写错误的可能性,这会使应用程序以非常意想不到的方式运行。

    如果您对应用状态执行类似操作,则必须确保在设置值之前锁定和解锁值。

    【讨论】:

      【解决方案4】:

      我不确定这个包装器是否有用,但我认为您可以进行以下改进 而不是

      public static string Get(string key)
      {
          object value = HttpContext.Current.Request.QueryString[key];
          return (value == null) ? null : value.ToString();
      }
      

      你可以使用

      public static string Get(string key)
      {
          return HttpContext.Current.Request.QueryString[key];
      }
      

      Post 方法也一样。 如果您可以通过 StoreInSession 方法将任何对象存储在会话中,那么您的 Session 方法是否只返回字符串?

      【讨论】:

      • 我已将会话更改为返回对象类型,但是,这不是我最初的问题。请保持目标。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 2015-01-19
      相关资源
      最近更新 更多