c#购物车

时间:2012-04-20 16:48:15

标签: c# cart shopping

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

Full Code reference is here

但我确定这是违规代码

// 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);
    }
}

2 个答案:

答案 0 :(得分:13)

我已经使用了几个商业购物车,并且每个商店都在购物车中存储了购物车,甚至在结帐之前,存储在数据库中,并且只在会话中存储会话ID。 SessionID与临时购物车中的字段相关联。

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

答案 1 :(得分:2)

如果您正在使用静态变量,那么任何线程(无论哪个用户)都可以访问该数据。这意味着您基本上在所有用户之间共享一张购物卡,我怀疑您不想这样做。

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

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>();
}