在会话中存储自定义对象

本文关键字:自定义 对象 存储 会话 | 更新日期: 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
}

这里有几点需要考虑:

  1. 每当web应用程序或web服务器回收/重启时,您的进程内会话将丢失。这意味着你需要在数据库中适当的点保存会话。
  2. 您可以使用进程外会话存储(数据库或其他服务器)-在这种情况下,您必须将购物车类标记为可序列化的。进程外会话有性能成本。因此,您已经将会话存储在数据库中,因此在我看来,您应该使用进程内会话,确保尽快将脏会话写入数据库。

将其添加到母版页或者您可以为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
}