我通常使用它作爲會話密鑰,然後根據需要顯式添加對象。原因是這是一個乾淨的方式來做到這一點,我發現你想保持會話中的對象數量最少。
這種特殊的方法將表單身份驗證和用戶會話集中在一起,因此您可以添加對象並忘記它。可以認爲這是一個很大的冗餘,但它確實可以防止任何雙重打擊,並且在會話中不應該有太多的對象。
以下內容可以存在於核心庫或任何你想要的地方。
/// <summary>
/// Provides a default pattern to access the current user in the session, identified
/// by forms authentication.
/// </summary>
public abstract class MySession<T> where T : class
{
public const string USERSESSIONKEY = "CurrentUser";
/// <summary>
/// Gets the object associated with the CurrentUser from the session.
/// </summary>
public T CurrentUser
{
get
{
if (HttpContext.Current.Request.IsAuthenticated)
{
if (HttpContext.Current.Session[USERSESSIONKEY] == null)
{
HttpContext.Current.Session[USERSESSIONKEY] = LoadCurrentUser(HttpContext.Current.User.Identity.Name);
}
return HttpContext.Current.Session[USERSESSIONKEY] as T;
}
else
{
return null;
}
}
}
public void LogOutCurrentUser()
{
HttpContext.Current.Session[USERSESSIONKEY] = null;
FormsAuthentication.SignOut();
}
/// <summary>
/// Implement this method to load the user object identified by username.
/// </summary>
/// <param name="username">The username of the object to retrieve.</param>
/// <returns>The user object associated with the username 'username'.</returns>
protected abstract T LoadCurrentUser(string username);
}
}
然後在命名空間到你的項目的根目錄下面的類來實現這一點(我通常把它在MVC項目代碼文件夾):
public class CurrentSession : MySession<PublicUser>
{
public static CurrentSession Instance = new CurrentSession();
protected override PublicUser LoadCurrentUser(string username)
{
// This would be a data logic call to load a user's detail from the database
return new PublicUser(username);
}
// Put additional session objects here
public const string SESSIONOBJECT1 = "CurrentObject1";
public const string SESSIONOBJECT2 = "CurrentObject2";
public Object1 CurrentObject1
{
get
{
if (Session[SESSIONOBJECT1] == null)
Session[SESSIONOBJECT1] = new Object1();
return Session[SESSIONOBJECT1] as Object1;
}
set
{
Session[SESSIONOBJECT1] = value;
}
}
public Object2 CurrentObject2
{
get
{
if (Session[SESSIONOBJECT2] == null)
Session[SESSIONOBJECT2] = new Object2();
return Session[SESSIONOBJECT2] as Object2;
}
set
{
Session[SESSIONOBJECT2] = value;
}
}
}
FINALLY 的顯式聲明的一大優勢你在會話中想要的是,你可以在你的mvc應用程序的任何地方包括視圖中引用它。只是引用它:
CurrentSession.Instance.Object1
CurrentSession.Instance.CurrentUser
再次一點點比其他方法少通用的,但真的很清楚發生了什麼事情,沒有其他索具或扶養注射液和100%安全的請求上下文。
在另一個說明中,dicionary的方法很酷,但你仍然會在各處引用字符串來引用東西。你可以使用枚舉或其他東西,但我更喜歡強大的打字和設置,並忘記了上述方法。
如果將相同類型傳遞給多個控制器,會發生什麼?一個會話會覆蓋另一個會話? – 2009-11-10 20:17:02
不,它們都具有相同的類型名稱,並因此具有相同的會話密鑰。會話對象不會被替換,它們將只是兩個控制器中的同一個對象。 – 2009-11-10 20:18:32
下面添加的答案不需要基礎控制器,甚至可以在視圖代碼中訪問會話。 – Gats 2013-07-28 07:06:03