【发布时间】:2017-10-07 02:06:28
【问题描述】:
我已经看到了许多 ASP.NET 会话状态的“包装”类,其中一些做了类似的事情:
强类型层(伪代码 #1)
public class MySession
{
public int MyID
{
get
{
return Convert.ToInt32(HttpContext.Current.Session["MyID"]);
}
set
{
HttpContext.Current.Session["MyID"] = value;
}
}
public string MyName
{
get
{
return (HttpContext.Current.Session["MyName"]).ToString();
}
set
{
HttpContext.Current.Session["MyName"] = value;
}
}
...
public MySession()
{
// Could be static or instantiated depending on needs...
}
...
}
///// USAGE IN OTHER CLASS /////
MySession currSession = new MySession();
currSession.MyID = 5;
currSession.MyName = "John Doe";
Console.WriteLine($"{currSession.MyName}'s ID = {currSession.MyID}");
然后我看到其他人这样做:
通用列表变体(伪代码 #2)
public class SessionVariables
{
public int MyID
{
get;
set
{
MyID = value;
MySession.SaveVariables();
}
}
public string MyName
{
get;
set
{
MyName = value;
MySession.SaveVariables();
}
}
...
}
public class MySession
{
public static List<SessionVariables> Variables;
// Might be private in real application environment
public MySession() // Could be static or instantiated depending on needs...
{
if (HttpContext.Current.Session["MyVariables"] == null)
{
HttpContext.Current.Session["MyVariables"] = new List<SessionVariables>();
}
// Obviously more appropriate checking to do here, but for simplicity's sake...
Variables = (List<SessionVariables>)HttpContext.Current.Session["MyVariables"]
}
public static void SaveVariables()
{
HttpContext.Current.Session["MyVariables"] = Variables;
}
...
}
///// USAGE /////
public class MyPage
{
public void MyMethod()
{
MySession currSession = new MySession(); // Create variables
MySession.Variables.MyID = 5;
MySession.Variables.MyName = "John Doe";
Console.WriteLine($"{MySession.Variables.MyName}'s ID = {MySession.Variables.MyID}");
...
}
}
想法
显然,这些示例都是伪代码样式(因此请忽略一般错误),但它们说明了为会话状态构建数据访问层的一些方法。
我做了一些与第一个变体类似的事情,尽管它具有更全面的数据类型映射/转换计划。我使用一个“普通”类来包装 Session,但它很容易是静态的,因为当调用它们的“get”时属性将从 Session 状态中提取,因此永远不会不同步,因为该类实际上不持有任何数据本身。
从第一印象来看,第二个对我来说似乎更“矫枉过正”,因为是的,您只将一个变量存储在 Session 状态中,但它通过强制代码引用列表而使其余代码混乱:
myObject.TheList.VariableIWant
VS
myObject.VariableIWant
我更喜欢后者(只是看起来更干净),尽管这可以很容易地隐藏在超类中,或者只是让局部变量直接引用列表:
new MySession(); // Create the variables
List<SessionVariables> mySession = MySession.Variables;
...虽然乍一看这对我来说有点脏。但是,我不知道使用列表进行存储实际上会给代码/性能带来多少好处,因为存储表示列表的对象应该占用与单独执行每个变量一样多的内存,至少这是我的想法。
问题
从长远来看,哪种做法更好/维护成本低?和/或哪个给网站带来更好的性能?
【问题讨论】:
-
会话是邪恶的。最好的方法是不使用会话并建立无状态网站。这两个解决方案看起来不是线程安全的,我认为它们不会那么好。
-
@FilipCordas 好吧,是的(因此使用自定义类来包装它)......但有时你必须使用 Sessions / 自定义包装类。使用查询字符串可以(有时是)被认为是一种安全风险,因为您将有关服务器代码的知识暴露给最终用户,这很少是一个好主意。那么如何将特定信息从一页转移到下一页呢?即如果用户点击一个订单,你如何将订单号转移到订单详情页面?
标签: c# asp.net session model-view-controller