Before we get started, let us see the general way to use Session in ASP.NET
if (Session["UserName"] == null)
{
LabelUserName.Text = "Anonymous";
}
else
{
LabelUserName.Text = (string)Session["UserName"];
}
You can feel some drawbacks e.g. to check null reference, type safety, to cast object..etc.
Now add following class and see how it solves the issues:
public class SessionManager
{
public static T Get<T>(string key)
{
object sessionObject = HttpContext.Current.Session[key];
if (sessionObject == null)
{
return default(T);
}
return (T)HttpContext.Current.Session[key];
}
public static T Get<T>(string key, T defaultValue)
{
object sessionObject = HttpContext.Current.Session[key];
if (sessionObject == null)
{
HttpContext.Current.Session[key] = defaultValue;
}
return (T)HttpContext.Current.Session[key];
}
public static void Save<T>(string key, T entity)
{
HttpContext.Current.Session[key] = entity;
}
public static void Remove(string key)
{
HttpContext.Current.Session.Remove(key);
}
}
It contains a few generic methods to read and write objects from/to the Session. You can use the above class in your ViewModel or Business Object (BO) to generate strongly typed property from the Session like below:
public String UserName
{
get { return SessionManager.Get<String>("UserName", "Anonymous"); }
set { SessionManager.Save<String>("UserName", value); }
}
public Int32 UserId
{
get { return SessionManager.Get<Int32>("UserId", -1); }
set { SessionManager.Save<Int32>("UserId", value); }
}
The Initial example can be written in following way:
LabelUserName.Text = SessionManager.Get<String>("UserName", "Anonymous");
OR
LabelUserName.Text = MyViewModel.UserName;
You can see how simple it is.
In this post, we created a generic version of getting and setting Session objects and created strongly typed properties using it.
Hope, It helps. Feel free to share your opinion in comment box.