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

浙公网安备 33010602011771号