跟随其他人所说的。我倾向于有两层:
核心层。这是在几乎所有 Web 应用程序项目中添加的 DLL 中。在这个我有一个 SessionVars 类,它为 Session 状态获取器/设置器执行 grunt 工作。它包含如下代码:
public class SessionVar
{
static HttpSessionState Session
{
get
{
if (HttpContext.Current == null)
throw new ApplicationException("No Http Context, No Session to Get!");
return HttpContext.Current.Session;
}
}
public static T Get<T>(string key)
{
if (Session[key] == null)
return default(T);
else
return (T)Session[key];
}
public static void Set<T>(string key, T value)
{
Session[key] = value;
}
}
注意获取任何类型的泛型。
然后,我还为特定类型添加 Getters/Setters,尤其是字符串,因为我经常更喜欢使用 string.Empty 而不是 null 来处理呈现给用户的变量。
例如:
public static string GetString(string key)
{
string s = Get<string>(key);
return s == null ? string.Empty : s;
}
public static void SetString(string key, string value)
{
Set<string>(key, value);
}
等等...
然后我创建包装器将其抽象出来并将其带到应用程序模型中。例如,如果我们有客户详细信息:
public class CustomerInfo
{
public string Name
{
get
{
return SessionVar.GetString("CustomerInfo_Name");
}
set
{
SessionVar.SetString("CustomerInfo_Name", value);
}
}
}
你明白吗?:)
注意:在为已接受的答案添加评论时想到了。使用状态服务器时,在将对象存储在 Session 中时,始终确保对象是可序列化的。在网络农场上尝试使用泛型保存对象非常容易,而且它会蓬勃发展。我在工作中部署在网络农场上,因此在核心层中对我的代码添加了检查,以查看对象是否可序列化,这是封装 Session Getter 和 Setter 的另一个好处:)