C# 购物车

C# 购物车,c#,cart,shopping,C#,Cart,Shopping,我一直在看这段代码来创建一个基本的购物车,但缺点是它使用一个静态方法&因此,当购物车项目添加到购物篮中时,会在会话之间共享。有人能指出如何修改ShoppingCart方法以删除此限制吗 但我确信这是令人不快的代码 // Readonly properties can only be set in initialization or in a constructor public static readonly ShoppingCart Instance; // The static const

我一直在看这段代码来创建一个基本的购物车,但缺点是它使用一个静态方法&因此,当购物车项目添加到购物篮中时,会在会话之间共享。有人能指出如何修改ShoppingCart方法以删除此限制吗

但我确信这是令人不快的代码

// Readonly properties can only be set in initialization or in a constructor
public static readonly ShoppingCart Instance;

// The static constructor is called as soon as the class is loaded into memory
static ShoppingCart() {
    // If the cart is not in the session, create one and put it there
    // Otherwise, get it from the session
    if (HttpContext.Current.Session["ASPNETShoppingCart"] == null) {
        Instance = new ShoppingCart();
        Instance.Items = new List<CartItem>();
        HttpContext.Current.Session["ASPNETShoppingCart"] = Instance;
    } else {
        Instance = (ShoppingCart)HttpContext.Current.Session["ASPNETShoppingCart"];
    }
}

// A protected constructor ensures that an object can't be created from outside
protected ShoppingCart() { }

public void AddItem(int productId) {
    // Create a new item to add to the cart
    CartItem newItem = new CartItem(productId);

    // If this item already exists in our list of items, increase the quantity
    // Otherwise, add the new item to the list
    if (Items.Contains(newItem)) {
        foreach (CartItem item in Items) {
            if (item.Equals(newItem)) {
                item.Quantity++;
                return;
            }
        }
    } else {
        newItem.Quantity = 1;
        Items.Add(newItem);
    }
}

我曾经使用过几个商业购物车,其中每一个都将购物车存储在DB中,甚至在结账之前,并且在会话中只存储会话ID。该SessionID绑定到临时购物车中的as字段


我强烈建议遵循同样的模式。假设你的网站很受欢迎。在内存中存储太多数据,无论是在会话中还是在应用程序中,您都会遇到问题。

我使用过多个商业购物车,其中每一个都将购物车存储在DB中,甚至在结账之前,并且在会话中只存储会话ID。该SessionID绑定到临时购物车中的as字段


我强烈建议遵循同样的模式。假设你的网站很受欢迎。在内存中存储太多数据,无论是在会话中还是在应用程序中,都会遇到问题。

如果您使用的是静态变量,那么任何线程都将有权访问该数据,而不管哪个用户有权访问该数据。这意味着你基本上拥有一张所有用户共享的购物卡,我怀疑你不想要

相反,您可以使用受保护的构造函数来防止手动实例化,然后使用静态方法来读取会话对象并获取当前实例。至于填写项目列表的静态方法,应该在构造函数中进行

public static ShoppingCart GetInstance()
{
    ShoppingCart cart = (ShoppingCart)Session["ASPNETShoppingCart"];

    if (cart == null)
    {
        Session["ASPNETShoppingCart"] = cart = new ShoppingCart();
    }

    return cart;
}

protected ShoppingCart()
{
    Items = new List<CartItem>();
}

如果您使用的是静态变量,那么任何线程都可以访问该数据,而不管是哪个用户。这意味着你基本上拥有一张所有用户共享的购物卡,我怀疑你不想要

相反,您可以使用受保护的构造函数来防止手动实例化,然后使用静态方法来读取会话对象并获取当前实例。至于填写项目列表的静态方法,应该在构造函数中进行

public static ShoppingCart GetInstance()
{
    ShoppingCart cart = (ShoppingCart)Session["ASPNETShoppingCart"];

    if (cart == null)
    {
        Session["ASPNETShoppingCart"] = cart = new ShoppingCart();
    }

    return cart;
}

protected ShoppingCart()
{
    Items = new List<CartItem>();
}

如果使用包含用户特定数据的静态变量,则所有用户都可以访问该数据。@David-篮子内容使用DES加密,然后由第三方支付提供商发布和处理,因此我知道ecommcerce的安全/PCI方面。至于购买第三方解决方案,对于这样一个小项目来说,这不是一个真正的选项。@Matthew,谢谢,我也意识到了这一点:如果您使用包含用户特定数据的静态变量,所有用户都可以访问该数据。@David-篮子内容使用DES进行加密,然后由第三方支付提供商发布和处理,因此我知道ecommcerce的安全/PCI方面。至于购买第三方解决方案,对于这样一个小项目来说,这并不是一个真正的选择。@Matthew,谢谢,我也知道这一点:O