Через нестандартність Інтернету, сеанси також є надзвичайно корисним способом зберігання об'єктів у запитах шляхом їх послідовного зберігання та зберігання у сеансі.
Ідеальним випадком використання цього може бути, якщо вам потрібно отримати доступ до регулярної інформації у вашій програмі, щоб зберегти додаткові дзвінки до бази даних за кожним запитом, ці дані можуть бути збережені в об'єкті та несеріалізовані для кожного запиту, наприклад:
Наш об'єкт для багаторазового використання, що серіалізується:
[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
файлі.
Для тих, хто не знайомий з об'єктами введення сеансу, ви можете знайти більш глибоку публікацію в блозі про цю тему тут .
Слово попередження:
Варто зазначити, що сеанси повинні бути зведені до мінімуму, великі сеанси можуть почати викликати проблеми з ефективністю.
Також рекомендується не зберігати в них будь-яких конфіденційних даних (паролів тощо).