C# - 处理会话变量,如常规变量

时间:2016-10-10 11:20:09

标签: c# asp.net session-variables

我的主要问题是,我有一个代码,它充满了设置/获取会话变量的方法调用,这使得源难以阅读。我正在寻找更好/更简单/更优雅的解决方案。我在类,包装类,隐式类型转换中尝试了运算符重载,但是我遇到了所有这些问题。

我想处理像常规变量这样的会话变量。 在阅读了很多文章之后,我想出了以下解决方案,我想让它变得更简单:

public class SV_string
{
    private string key = ""; //to hold the session variable key

    public SV_string(string key)
    {
        this.key = key; // I set the key through the constructor
    }
    public string val // I use this to avoid using setter/getter functions
    {
        get
        {
            return (string)System.Web.HttpContext.Current.Session[key];
        }
        set
        {
            System.Web.HttpContext.Current.Session[key] = value;
        }
    }
}

我使用与变量名相同的密钥:

public static SV_string UserID = new SV_string("UserID"); 

UserID.val = "Admin"; //Now the value assignment is quite simple
string user = UserID.val; //Getting the data is quite simple too

UserID = "Admin"; //but it would be even simpler

那么有什么方法可以达到预期的行为吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

您可以创建以下会话包装器,只需将方法/属性/成员添加到其中

public static class EasySession
{
    public static string UserId
    {
        get
        {
            return Get<string>();
        }
        set
        {
            Set(value);
        }
    }

    public static string OtherVariableA
    {
        get
        {
            return Get<string>();
        }
        set
        {
            Set(value);
        }
    }

    public static <datatype> OtherVariableB
    {
        get
        {
            return Get<datatype>();
        }
        set
        {
            Set(value);
        }
    }


    static  void Set<T>(T value, [CallerMemberName] string key = "")
    {
            System.Web.HttpContext.Current.Session[key] = value;
    }

    static  T Get<T>([CallerMemberName] string key = "")
    {
        return (T)System.Web.HttpContext.Current.Session[key];
    }
}

然后您将使用它如下

EasySession.UserId = "Admin"

更好。如果您使用的是C#6.0,则可以将以下内容添加到命名空间

using System;
using static xxx.EasySession;

这将允许您只需致电

UserId = "Admin"

以下是它的工作原理

[CallerMemberName]将获取调用Get或Set的名称。在这种情况下,它将低音为&#34; UserId 例如Set(&#34; UserId&#34;,&#34; Admin&#34;)

然后它将继续执行以下操作 System.Web.HttpContext.Current.Session [&#34; UserId&#34;] =&#34; Admin&#34;;

(参考文献:https://msdn.microsoft.com/en-us/magazine/dn879355.aspx

答案 1 :(得分:0)

只需使用属性将会话变量包装进去。
代码的其他部分不需要知道它的实现,使用Session变量或它存储在哪个键名中:

public string  UserId
{
    get 
    {
        return (string)System.Web.HttpContext.Current.Session["UserId"];
    }
    set
   {
       System.Web.HttpContext.Current.Session["UserId"] = value;
   }
}

答案 2 :(得分:0)

我建议创建一个带有操作的接口(没有属性),以及该接口的一个具体实现,它实际上将这些变量作为HTTP上下文中的会话变量访问;还可以在单​​元测试中使用另一个模拟实现;因为在这些情况下不能使用HTTP上下文。

因此,在您的代码中,您针对这些接口进行编程,并在运行时注入具体实现。站点启动时,它是使用Session的具体实现;从测试中,它是模拟的实现。

使用操作而不是属性的原因是明确告诉用户您不仅要访问正常属性,还要访问可能具有重要副作用的会话变量。

警告:避免使用静态 !!!这将导致不良副作用,例如不同用户之间的共享数据。