Web'in durumsuz doğası nedeniyle, oturumlar, nesneleri serileştirerek ve bir oturumda depolayarak istekler arasında kalıcı olarak kalmanın son derece yararlı bir yoludur.
Bunun mükemmel bir kullanım örneği, uygulamanız genelinde düzenli bilgilere erişmeniz gerektiğinde, her talepte ek veritabanı çağrıları kaydetmeniz gerektiğinde, bu veriler bir nesnede saklanabilir ve her istekte serileştirilmemiş olabilir, örneğin:
Yeniden kullanılabilir, serileştirilebilir nesnemiz:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Kullanım durumu:
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 */
}
}
Bu nesne bir kez serileştirildikten sonra, onu oluşturmaya veya içindeki veriler için veritabanını yeniden sorgulamaya gerek kalmadan tüm denetleyicilerde kullanabiliriz.
Dependency Injection kullanarak oturum nesnenizi enjekte edin
İdeal bir dünyada, ' bir arabirime programlayıp uygulama yerine programlayacaksınız ' ve serileştirilebilir oturum nesnenizi, tercih ettiğiniz Kontrolün Tersine Çevirme kapsayıcınızı kullanarak denetleyicinize enjekte edersiniz (bu örnek, en aşina olduğum YapıMap'i kullanır. ).
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;
}
}
Daha sonra bunu Global.asax.cs
dosyanıza kaydedersiniz.
Oturum nesnelerini enjekte etmeye aşina olmayanlar için, burada konu hakkında daha derinlemesine bir blog yazısı bulabilirsiniz .
Uyarı kelimesi:
Seansların minimumda tutulması gerektiğini, büyük seansların performans sorunlarına neden olabileceğini belirtmek gerekir.
Ayrıca herhangi bir hassas veriyi (şifreler vb.) Saklamamanız önerilir.