What the general way of storing custom objects in sessions?
I’m planning on keeping my cart in a session throughout the web application. When that user logs out, the session will be cleared.
Class ShoppingCart
{
private List<CartItem> Items = new List<CartItem>();
public ShoppingCart()
{
this.Items = new List<CartItem>();
if (HttpCurrent.Current["Cart"]!=null])
{
this.Items = ShoppingCart.loadCart(HttpCurrent.Current["User"]);
}
}
}
When the user signs in, I place the cart in a session, like:
Session["Cart"] = new ShoppingCart();
But do I have to write Session["Cart"] on each and every page? Isn’t there an easier way to do this? Also what about the Guest cart session? Where will I declare that?
I want each user session stored in a unique session, so that there’s no mixing up between the guest session and the member session.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
ASP.NET session corresponds to browser session – it is independent of whether user is authenticated (logged in) or not. So you should not have any issue with regards to guest/member sessions. I would advise you to expose the current shopping cart via static accessor property – for example
Class ShoppingCart {
public static ShoppingCart Current
{
get
{
var cart = HttpContext.Current.Session["Cart"] as ShoppingCart;
if (null == cart)
{
cart = new ShoppingCart();
HttpContext.Current.Session["Cart"] = cart;
}
return cart;
}
}
... // rest of the code
}
Few things to consider here:
- Whenever web application or web server recycles/restarts, your in-process sessions would lost. It means you need persist your session in database at appropriate point.
- You may use out of process session storage (database or different server) – you have to mark your shopping cart class as serializable in such case. There is performance cost to out-of-process sessions. As such, you are already storing session in database, so IMO, you should use in-proc sessions making sure to write dirty sessions into the database as soon as possible.
Method 2
Add it to a master page or you could add a static property to you ShoppingCart object
public static ShoppingCart GetCurrent
{
get
{
if(HTTPContext.Current.Session["CurrentCart"] == null)
{
HTTPContext.Current.Session["CurrentCart"] = new ShoppingCart();
}
return HTTPContext.Current.Session["CurrentCart"] as ShoppingCart;
}
}
Method 3
Generic Extension Method definition in a static class:
public static T GetSession<T>(string key) => HttpContext.Current?.Session?[key] != null ? (T)HttpContext.Current.Session[key] : default(T);
usage example
implicit
var myCart = GetSession<ShoppingCart>("myKey");
inference
ShoppingCart myCart2 = GetSession("myKey");
check if exists
if(myCart != default(ShoppingCart)){
// do stuff
}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0