[英]Better way to manage Session data
我需要在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>
) 您也可以使用擴展方法,但我認為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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.