遵循其他人所说的。我倾向于有两层:
核心层。这是在添加到几乎所有 Web 应用程序项目的 DLL 中。在此我有一个 SessionVars 类,它为会话状态 getter/setter 执行繁重的工作。它包含如下代码:
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。
e.g:
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);
}
}
}
你明白这个想法了吗? :)
NOTE:只是在向已接受的答案添加评论时有一个想法。使用状态服务器时,将对象存储在 Session 中时,始终确保对象是可序列化的。在网络农场中尝试使用泛型保存对象非常容易,而且它会蓬勃发展。我在工作中部署在网络场上,因此在核心层的代码中添加了检查,以查看对象是否可序列化,这是封装会话 Getters 和 Setters 的另一个好处:)