เนื่องจากลักษณะของเว็บที่ไม่มีสถานะเซสชันจึงเป็นวิธีที่มีประโยชน์อย่างยิ่งในการคงออบเจ็กต์ข้ามคำขอโดยการทำให้เป็นอนุกรมและจัดเก็บไว้ในเซสชัน
กรณีการใช้งานที่สมบูรณ์แบบอาจเป็นได้หากคุณต้องการเข้าถึงข้อมูลปกติในแอปพลิเคชันของคุณเพื่อบันทึกการเรียกฐานข้อมูลเพิ่มเติมในแต่ละคำขอข้อมูลนี้สามารถเก็บไว้ในวัตถุและไม่ได้รับการระบุชื่อสำหรับแต่ละคำขอเช่น:
วัตถุที่สามารถนำมาใช้ซ้ำได้ของเรา:
[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 */
}
}
เมื่ออ็อบเจ็กต์นี้ถูกทำให้เป็นอนุกรมแล้วเราสามารถใช้กับคอนโทรลเลอร์ทั้งหมดได้โดยไม่จำเป็นต้องสร้างหรือสืบค้นฐานข้อมูลสำหรับข้อมูลที่มีอยู่ภายในอีกครั้ง
ใส่วัตถุเซสชันของคุณโดยใช้ Dependency Injection
ในโลกแห่งอุดมคติคุณจะ 'ตั้งโปรแกรมไปยังอินเทอร์เฟซไม่ใช่การนำไปใช้งาน ' และฉีดอ็อบเจ็กต์เซสชันที่ต่ออนุกรมลงในคอนโทรลเลอร์ของคุณโดยใช้คอนเทนเนอร์ Inversion of Control ที่คุณเลือกเช่นนั้น (ตัวอย่างนี้ใช้ 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
ไฟล์ของคุณ
สำหรับผู้ที่ไม่คุ้นเคยกับการฉีดวัตถุเซสชั่นที่คุณสามารถหาบล็อกโพสต์เพิ่มเติมในเชิงลึกเกี่ยวกับเรื่องที่นี่
คำเตือน:
เป็นที่น่าสังเกตว่าควรลดจำนวนเซสชันให้น้อยที่สุดเซสชันจำนวนมากอาจทำให้เกิดปัญหาด้านประสิทธิภาพได้
ขอแนะนำว่าอย่าเก็บข้อมูลที่ละเอียดอ่อนไว้ในนั้น (รหัสผ่าน ฯลฯ )