繁体   English   中英

在静态类中包装会话处理

[英]Wrapping session handling inside the static class

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

这是代码:

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;
    }

}

如果与此有关的任何功能性问题,很多应用程序很可能早就失败了:)

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

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

如何从ASP.NET中的任何类访问会话变量?

从概念上讲,您应该没问题。 即使在可能发生竞争情况的部分回发(EG,AJAX)场景中,您也应该没事。 会话状态使用读取器/写入器锁来确保您的安全。

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

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

我不确定此包装程序是否有用,但是我认为您可以进行以下改进,而不是

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方法仅返回string是真的吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM