在会话中存储自定义对象
本文关键字:自定义 对象 存储 会话 | 更新日期: 2023-09-27 17:50:15
在会话中存储自定义对象的一般方法是什么?
我计划在整个web应用程序的会话中保持我的购物车。当该用户退出时,会话将被清除。
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"]);
}
}
}
当用户登录时,我将购物车放入会话中,如:
Session["Cart"] = new ShoppingCart();
但是我必须在每一页上都写Session["Cart"]
吗?没有更简单的方法吗?还有客人推车环节呢?我要在哪里申报?
我希望每个用户会话存储在一个唯一的会话中,这样就不会在来宾会话和成员会话之间混淆。
. NET会话对应于浏览器会话——它与用户是否经过身份验证(登录)无关。所以你不应该有任何问题,关于客人/会员会议。我建议您通过静态访问器属性公开当前购物车—例如
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
}
这里有几点需要考虑:
- 每当web应用程序或web服务器回收/重启时,您的进程内会话将丢失。这意味着你需要在数据库中适当的点保存会话。
- 您可以使用进程外会话存储(数据库或其他服务器)-在这种情况下,您必须将购物车类标记为可序列化的。进程外会话有性能成本。因此,您已经将会话存储在数据库中,因此在我看来,您应该使用进程内会话,确保尽快将脏会话写入数据库。
将其添加到母版页或者您可以为ShoppingCart对象添加静态属性
public static ShoppingCart GetCurrent
{
get
{
if(HTTPContext.Current.Session["CurrentCart"] == null)
{
HTTPContext.Current.Session["CurrentCart"] = new ShoppingCart();
}
return HTTPContext.Current.Session["CurrentCart"] as ShoppingCart;
}
}
静态类中的泛型扩展方法定义:
public static T GetSession<T>(string key) => HttpContext.Current?.Session?[key] != null ? (T)HttpContext.Current.Session[key] : default(T);
用法的例子隐式
var myCart = GetSession<ShoppingCart>("myKey");
推论ShoppingCart myCart2 = GetSession("myKey");
检查是否存在
if(myCart != default(ShoppingCart)){
// do stuff
}