En raison de la nature sans état du Web, les sessions sont également un moyen extrêmement utile de persister des objets à travers les demandes en les sérialisant et en les stockant dans une session.
Un cas d'utilisation parfait de ceci pourrait être si vous avez besoin d'accéder à des informations régulières dans toute votre application, pour enregistrer des appels de base de données supplémentaires à chaque demande, ces données peuvent être stockées dans un objet et non sérialisées à chaque demande, comme ceci:
Notre objet réutilisable et sérialisable:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Cas d'utilisation:
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 */
}
}
Une fois cet objet sérialisé, nous pouvons l'utiliser sur tous les contrôleurs sans avoir besoin de le créer ou d'interroger à nouveau la base de données pour les données qu'il contient.
Injectez votre objet de session à l'aide de l'injection de dépendances
Dans un monde idéal, vous `` programmez sur une interface, pas une implémentation '' et injectez votre objet de session sérialisable dans votre contrôleur en utilisant votre conteneur Inversion of Control de votre choix, comme ceci (cet exemple utilise StructureMap car c'est celui avec lequel je suis le plus familier ).
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;
}
}
Vous enregistrerez alors ceci dans votre Global.asax.cs
dossier.
Pour ceux qui ne sont pas familiarisés avec l'injection d'objets de session, vous pouvez trouver un article de blog plus détaillé sur le sujet ici .
Un mot d'avertissement:
Il convient de noter que les sessions doivent être réduites au minimum, de grandes sessions peuvent commencer à causer des problèmes de performances.
Il est également recommandé de ne pas y stocker de données sensibles (mots de passe, etc.).