petshop之购物车再思考

我先不说泛型Dictionary的应用了,这个会放在另一篇中讲。那么今天就来看看这个购物车的实现全过程吧。

首先先来看吧商品添加到购物车的函数Add吧(按照常例先贴代码):

public void Add(string itemId) {
            CartItemInfo cartItem;//声明一个购物车实体类变量
            if (!cartItems.TryGetValue(itemId, out cartItem)) {
                //如果键值不存在,下面的else中如果键值存在了Quantity增加一,
                //但是如果键值没有存在了他就没有处理数量了,这个时候数量应该是1,是默认的值,请看实体类CartItemInfo就知道了
                Item item = new Item();//实例化一个宠物的类(在MSPetShop4数据库中)
                ItemInfo data = item.GetItem(itemId);//通过宠物编号得到宠物的基本信息,并将其赋值给ItemInfo这个实体类
                if (data != null) {
                    //这个CartItemInfo是相对于MSPetShopProfile数据库的,这样的话就在不同数据库之间传递数据了
                    CartItemInfo newItem = new CartItemInfo(itemId, data.ProductName, 1, (decimal)data.Price, data.Name, data.CategoryId, data.ProductId);
                    cartItems.Add(itemId, newItem);//在字典中添加新建itemid
                }
            }
            else
                cartItem.Quantity++;//如果可以在字典中找到键值,则将宠物数量加1
        }

1、其实上面我都有做解释的,但这边还是要说下他们用到的技巧。首先,动物的基本信息(如价格,所属类别等)都再MSPetshop4中,而我们的购物车信息室在

MSPetShop4Profile数据库中,那么这边就用到了两个数据库中的信息的传递,这个传递其实也很简单,并非想象中的那么复杂。想象前台我们点击某样东西,然后添加到购物车,这两步过程其实涉及到两个不同的数据库(分别为上面两个),然后就是吧MSPetshop4中item的相关信息添加到MSPetShop4Profile中的CartItem中。说滴有点罗嗦。

2、看下实体类CartItemInfo吧

  [Serializable]
    public class CartItemInfo {

        // Internal member variables
        private int quantity = 1;
        private string itemId;
        private string name;
        private string type;
        private decimal price;
        private string categoryId;
        private string productId;

看到没,它在生命变量的时候就已经吧购买的数量默认设置为1了。聪明吧。

二、更新购物车的相关宠物的购买数量:

 public void SetQuantity(string itemId, int qty) {
            cartItems[itemId].Quantity = qty;
        }

其实这个没有什么好说的,就是根据itemid对其Quantity进行修改吧了。

三、计算购物的总价钱:

public decimal Total {
            get {
                decimal total = 0;
                foreach (CartItemInfo item in cartItems.Values)//cartItems.Values是获取值的集合,从下面的操作我们可以看出,如果字典中已经存在键值的话,我们是直接获取Quantity的
                    total += item.Price * item.Quantity;
                return total;
            }
        }

这个是计算中价钱的方法,这边他们用了一个foreach循环吧购物车中的相关宠物的价钱累计起来。

四、下面这种添加购物车信息的方法在petshop中没有真正的用到:

public void Add(CartItemInfo item) {
            CartItemInfo cartItem;
            if (!cartItems.TryGetValue(item.ItemId, out cartItem))//参数一item.ItemId是键值,
                //如果Dictionary包含键值返回true,cartItem应该是返回的值,这里的话应该是ItemId,
                //但我不明白cartItem怎么匹配ItemId?否则false。
                //这个问题我可能已经明白了,因为如果键值已经存在了,我们就输出了cartItem类型,
                //这个应该相当于引用类型,我们再后面的数量添加自然也会添加到字典中了
                cartItems.Add(item.ItemId, item);//如果字典中不包含ItemId,将item.ItemId和item添加到词典中
            else
                cartItem.Quantity += item.Quantity;//如果ItemId在字典中可以找到,就更新ItemId对应的宠物数量,//
                                                   //但是为什么购物车包含那么都属性,而这里只添加了他的数量呢?
                                                  //经过思考,我现在也可能明白为什么只添加数量了,因为你键值既然存在了,
                                           //那么你就有相应的宠物的信息啦,那么你需要知道的是数量有没有变量罢了
        }

这个方法是直接传递一个CartItemInfo这个实体类进来,也就是说它不是像上面传递itemid的,这样的方面的好处是跟淘宝有点像,就是你前台可以选购你要买的东东的各样属性,比如颜色啊比如数量啊,这个方法非常好很好。

五、得到购物车里的所有CartItemInfo的信息,这个方法应该是直接点击下订单的时候才会有用到吧:

public ICollection<CartItemInfo> CartItems {
            get { return cartItems.Values; }//得到购物车中的所有内容(用一个对象返回)
        }

六、下订单

/// <summary>
        /// Method to convert all cart items to order line items
        /// </summary>
        /// <returns>A new array of order line items</returns>
        public LineItemInfo[] GetOrderLineItems() {

            LineItemInfo[] orderLineItems = new LineItemInfo[cartItems.Count];
            int lineNum = 0;

            foreach (CartItemInfo item in cartItems.Values)
                orderLineItems[lineNum] = new LineItemInfo(item.ItemId, item.Name, ++lineNum, item.Quantity, item.Price);

            return orderLineItems;
        }

  

  

原文地址:https://www.cnblogs.com/huaizuo/p/2177003.html