c# -像处理常规变量一样处理会话变量

本文关键字:处理 变量 一样 会话 常规 | 更新日期: 2023-09-27 18:12:24

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

我想处理会话变量像常规变量。在阅读了大量的文章之后,我想到了下面的解决方案,我想让它更简单:

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

那么有什么方法可以得到想要的行为吗?

提前感谢!

c# -像处理常规变量一样处理会话变量

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

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的名称。在这种情况下,它将基本是"UserId"如设置("标识"、"Admin")

然后它将运行并执行以下操作System.Web.HttpContext.Current。Session["UserId"] = "Admin";

(Ref: https://msdn.microsoft.com/en-us/magazine/dn879355.aspx)

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

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

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

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

使用操作而不是属性的原因是要显式地告诉用户,您访问的不仅仅是普通属性,而是会话变量,这可能有重要的副作用。

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