私は一般にこれをセッションキーに使用し、必要に応じて明示的にオブジェクトを追加します。その理由は、それを行うためのきれいな方法であり、セッションのオブジェクト数を最小限に抑えたいと思うからです。
この特定のアプローチでは、フォーム認証とユーザーセッションを1つの場所に集約して、オブジェクトを追加して忘れることができます。議論は、それが大きな冗長であることができるかもしれませんが、それはダブルアップを防ぎ、あなたはセッション中にあまりにも多くのオブジェクトを持つべきではありません。
以下は、コアライブラリまたは任意の場所に存在する可能性があります。明示的に宣言するの
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 大きな利点:
/// <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プロジェクトのコードのフォルダに入れて)あなたがセッションで欲しいのは、ビューを含め、あなたのmvcアプリケーション内のどこでもこれを絶対に参照できるということです。何が起こっているのか、他の談合や依存性の注入と要求コンテキストへの安全な100%、他のアプローチよりも
CurrentSession.Instance.Object1
CurrentSession.Instance.CurrentUser
ここでも少し一般的な、しかし本当に明確な:ちょうどでそれを参照しません。
別のノートでは、大胆なアプローチはクールですが、あなたはまだ参照用の場所に文字列で終わります。列挙型などでリグを作成することもできますが、私は強く入力することを好み、上記のアプローチを設定して忘れてしまいます。
複数のコントローラに同じタイプを渡すとどうなりますか? 1つのセッションでもう一方のセッションが上書きされますか? –
いいえ、どちらも同じタイプ名を持ち、同じセッションキーを持ちます。セッションオブジェクトは置き換えられず、両方のコントローラで同じオブジェクトになります。 –
下に追加されたのは、ベースコントローラを必要とせず、ビューコードでセッションにアクセスすることもできます。 – Gats