Do tính chất không trạng thái của web, các phiên cũng là một cách cực kỳ hữu ích để duy trì các đối tượng trên các yêu cầu bằng cách tuần tự hóa chúng và lưu trữ chúng trong một phiên.
Một trường hợp sử dụng hoàn hảo của trường hợp này có thể là nếu bạn cần truy cập thông tin thường xuyên trên ứng dụng của mình, để lưu các lệnh gọi cơ sở dữ liệu bổ sung cho mỗi yêu cầu, dữ liệu này có thể được lưu trữ trong một đối tượng và không được quản lý theo từng yêu cầu, như vậy:
Đối tượng có thể tái sử dụng, có thể tuần tự hóa của chúng tôi:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Trường hợp sử dụng:
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 */
}
}
Khi đối tượng này đã được tuần tự hóa, chúng ta có thể sử dụng nó trên tất cả các bộ điều khiển mà không cần tạo nó hoặc truy vấn lại cơ sở dữ liệu để tìm lại dữ liệu chứa trong nó.
Chèn đối tượng phiên của bạn bằng cách sử dụng Dependency Injection
Trong một thế giới lý tưởng, bạn sẽ ' lập trình cho một giao diện, không phải triển khai ' và đưa đối tượng phiên có thể tuần tự hóa của bạn vào bộ điều khiển của bạn bằng cách sử dụng vùng chứa Inversion of Control mà bạn lựa chọn, giống như vậy (ví dụ này sử dụng StructureMap vì nó là đối tượng mà tôi quen thuộc nhất ).
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;
}
}
Sau đó, bạn sẽ đăng ký điều này trong Global.asax.cs
tệp của bạn .
Đối với những người không quen với việc tiêm các đối tượng phiên, bạn có thể tìm thấy một bài đăng blog chuyên sâu hơn về chủ đề này tại đây .
Một lời cảnh báo:
Cần lưu ý rằng các phiên nên được giữ ở mức tối thiểu, các phiên lớn có thể bắt đầu gây ra các vấn đề về hiệu suất.
Bạn cũng không nên lưu trữ bất kỳ dữ liệu nhạy cảm nào trong đó (mật khẩu, v.v.).