Devido à natureza sem estado da web, as sessões também são uma forma extremamente útil de persistir objetos em solicitações, serializando-os e armazenando-os em uma sessão.
Um caso de uso perfeito disso poderia ser se você precisar acessar informações regulares em seu aplicativo, para salvar chamadas de banco de dados adicionais em cada solicitação, esses dados podem ser armazenados em um objeto e não serializados em cada solicitação, assim:
Nosso objeto reutilizável e serializável:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Caso de uso:
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 */
}
}
Uma vez que este objeto tenha sido serializado, podemos usá-lo em todos os controladores sem a necessidade de criá-lo ou consultar o banco de dados em busca dos dados contidos nele novamente.
Injetar seu objeto de sessão usando injeção de dependência
Em um mundo ideal, você iria " programar para uma interface, não para implementação " e injetar seu objeto de sessão serializável em seu controlador usando seu contêiner de Inversão de Controle de escolha, assim (este exemplo usa StructureMap, pois é o que estou mais familiarizado )
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;
}
}
Você então registraria isso em seu Global.asax.cs
arquivo.
Para aqueles que não estão familiarizados com a injeção de objetos de sessão, você pode encontrar uma postagem de blog mais detalhada sobre o assunto aqui .
Uma palavra de alerta:
É importante notar que as sessões devem ser reduzidas ao mínimo, sessões grandes podem começar a causar problemas de desempenho.
Também é recomendado não armazenar nenhum dado sensível neles (senhas, etc).