Web のステートレスな性質により、セッションは、オブジェクトをシリアライズしてセッションに保存することで、複数のリクエスト間でオブジェクトを永続化するための非常に便利な方法でもあります。
これの完璧な使用例は、アプリケーション全体で通常の情報にアクセスする必要がある場合で、リクエストごとに追加のデータベース呼び出しを節約するために、次のように、このデータをオブジェクトに保存し、リクエストごとにシリアル化を解除できます。
再利用可能でシリアライズ可能なオブジェクト:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
使用事例:
public class LoginController : Controller {
[HttpPost]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
var profileData = new UserProfileSessionData {
UserId = model.UserId,
EmailAddress = model.EmailAddress,
FullName = model.FullName
}
this.Session["UserProfile"] = profileData;
}
}
public ActionResult LoggedInStatusMessage()
{
var profileData = this.Session["UserProfile"] as UserProfileSessionData;
/* From here you could output profileData.FullName to a view and
save yourself unnecessary database calls */
}
}
このオブジェクトがシリアル化されると、オブジェクトを作成したり、データベースに格納されているデータを再度クエリしたりすることなく、すべてのコントローラーで使用できます。
依存性注入を使用してセッション オブジェクトを注入する
理想的な世界では、「実装ではなくインターフェイスにプログラム」し、選択した制御の反転コンテナーを使用して、シリアル化可能なセッション オブジェクトをコントローラーに挿入します (この例では、私が最もよく知っている StructureMap を使用します)。 )。
public class WebsiteRegistry : Registry
{
public WebsiteRegistry()
{
this.For<IUserProfileSessionData>().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());
}
public static IUserProfileSessionData GetUserProfileFromSession()
{
var session = HttpContext.Current.Session;
if (session["UserProfile"] != null)
{
return session["UserProfile"] as IUserProfileSessionData;
}
/* Create new empty session object */
session["UserProfile"] = new UserProfileSessionData();
return session["UserProfile"] as IUserProfileSessionData;
}
}
次に、これをファイルに登録しGlobal.asax.cs
ます。
セッション オブジェクトの注入に慣れていない方は、この件に関するより詳細なブログ投稿をこちらで参照できます。
警告の言葉:
セッションは最小限に抑える必要があることに注意してください。大規模なセッションはパフォーマンスの問題を引き起こし始める可能性があります。
また、機密データ (パスワードなど) を保存しないことをお勧めします。