我的主要问题是,我有一个代码,它充满了设置/获取会话变量的方法调用,这使得源难以阅读。我正在寻找更好/更简单/更优雅的解决方案。我在类,包装类,隐式类型转换中尝试了运算符重载,但是我遇到了所有这些问题。
我想处理像常规变量这样的会话变量。 在阅读了很多文章之后,我想出了以下解决方案,我想让它变得更简单:
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
那么有什么方法可以达到预期的行为吗?
提前致谢!
答案 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的具体实现;从测试中,它是模拟的实现。
使用操作而不是属性的原因是明确告诉用户您不仅要访问正常属性,还要访问可能具有重要副作用的会话变量。
警告:避免使用静态 !!!这将导致不良副作用,例如不同用户之间的共享数据。