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
那么有什么方法可以得到想要的行为吗?
提前感谢!
您可以创建下面的会话包装器,只需将您的方法/属性/成员添加到其中
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!!这将导致不良的副作用,如在不同的用户之间共享数据。