1

基本的なショッピング カートを作成するためにこのコードを見てきましたが、欠点は静的メソッドを使用しているため、ショッピング カートのアイテム (バスケットに追加されたとき) がセッション間で共有されることです。この制限を取り除くために 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);
    }
}
4

2 に答える 2

15

私はいくつかの商用ショッピングカートを使用してきましたが、それらのすべてが、チェックアウト前であってもカートをDBに保存し、セッションにセッションIDのみを保存しました。その SessionID は、一時カートのフィールドとして関連付けられていました。

同じパターンに従うことを強くお勧めします。あなたのサイトが非常に人気になったとします。メモリーに (セッションまたはアプリケーションのいずれかに関係なく) 大量のデータを保存すると、問題が発生します。

于 2012-04-20T16:52:20.490 に答える
3

静的変数を使用している場合、(ユーザーに関係なく) どのスレッドもそのデータにアクセスできます。これは基本的に、すべてのユーザー間で 1 つのショッピング カードを共有していることを意味しますが、これは望ましくないと思われます。

代わりに、保護されたコンストラクターを使用して手動でのインスタンス化を防止し、静的メソッドを使用して 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>();
}
于 2012-04-20T17:14:13.957 に答える