zoukankan      html  css  js  c++  java
  • 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;
            }
    

      

      

  • 相关阅读:
    GDB+QEMU调试内核模块(实践篇)
    排序算法的python实现
    Linux命令行相关
    操作系统与网络
    计算机组成原理
    有了自己的技术博客
    if 和 if else
    十效率换算成十六进制
    <<左移 >>右移 >>>无符号右移 &与运算 |或运算 ^异或运算 ~反码
    // &与 // |或 // ^异或 // !非 // &&短路 // ||短路
  • 原文地址:https://www.cnblogs.com/huaizuo/p/2177003.html
Copyright © 2011-2022 走看看