更好的方式来管理会话数据
本文关键字:会话 数据 管理 方式 更好 | 更新日期: 2023-09-27 18:18:41
我需要在Session中持久化一些数据。我写了很多这样的属性:
public List<string> FillOrder
{
get { return Session[SessionKeys.QueryFillOrder] as List<string> ?? new List<string>(); }
set { Session[SessionKeys.QueryFillOrder] = value; }
}
当我必须使用这些数据时,我必须编写这样的代码:
List<string> fillOrder = FillOrder;
fillOrder.Add(accordion.ID);
FillOrder = fillOrder;
这对我来说太难看了,因为我宁愿那样做:
FillOrder.Add(accordion.ID);
但是这样我的值就不会被保存回Session。
你能想到更好的方法来达到同样的结果吗?
非常感谢!
我总是在ASP周围使用包装器类。. NET会话简化对会话变量的访问:
public class MySession
{
// private constructor
private MySession()
{
FillOrder = new List<string>();
}
// Gets the current session.
public static MySession Current
{
get
{
var session = (MySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new MySession();
HttpContext.Current.Session["__MySession__"] = session;
}
return session;
}
}
// **** add your session properties here, e.g like this:
public List<string> FillOrder {get; set; }
public string Property1 { get; set; }
public DateTime MyDate { get; set; }
public int LoginId { get; set; }
}
这个类在ASP中存储它自己的一个实例。. NET会话,允许你从任何类中以类型安全的方式访问会话属性,例如:
MySession.Current.FillOrder.Add(accordion.ID);
int loginId = MySession.Current.LoginId;
string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;
DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;
这种方法有几个优点:
- 你可以初始化你的会话变量在构造函数(即
new List<string>
) - 它为您节省了大量的类型转换
- 您不必在整个应用程序中使用硬编码的会话密钥(例如session ["loginId"]
- 您可以通过在MySession 的属性上添加XML文档注释来记录会话项。
您也可以使用扩展方法,但我确实认为M4N的示例可能更好:
EDIT使其成为泛型
public static class Extensions
{
public static void AddWithSession<T>(this List<T> list, T value, string key)
{
list.Add(value);
HttpContext.Current.Session[key] = list;
}
}
str.AddWithSession(accordion.ID,SessionKeys.QueryFillOrder);
你可以写一个自己的类来实现ICollection或IList,在那里你会实现Add as Session[…]
按照@M4N的建议为所有Session变量使用一个类是一个好主意,尽管它可能会成为一个"上帝"类(在这种情况下,您可以划分为以这种方式实现的几个类)。
但是你可以像这样改变你的属性实现:
public List<string> FillOrder
{
get
{
List<string> result = Session[SessionKeys.QueryFillOrder] as List<string>;
if (result == null)
{
result = new List<string>();
Session[SessionKeys.QueryFillOrder] = result;
}
return result;
}
set { Session[SessionKeys.QueryFillOrder] = value; }
}
在这个例子中,你可能不需要setter