学习PetShop3.0(6)实体模型[1]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

还记得用户注册时收集信息的方式吗?下面这几句:

//......
AddressInfo address = addr.Address;
//.....
AccountInfo accountInfo = new AccountInfo(userId, password, email, address, language, favCategory, showFavorites, showBanners);
//.....
ccountController.CreateAccount(accountInfo)

AddressInfo和AccountInfo都是瘦实体类,整个程序都用这种模型来完成信息传递。这些类的定义都在Model组件中。应该是整个petshop3.0中最重要的组件之一。
Model:瘦数据类或业务实体,在应用程序各层之间传递数据的瘦数据类。这些是用 C# 类实现的,每个字段都以属性的形式公开。 每个类都标记为“serializable”,启用进程间传输。
.net是面向对象的,这大家都知道,可以在具体实现的时候应该怎么做呢?总之我是完全的不明白。不过看了petshop3.0中Model组件的应用,算是又长了见识。
在程序中总有那么一些信息可以归为一类,比如商品信息,用户信息……拿用户信息来说,应该有用户名、密码、住址、电话、个人爱好等具体的信息。在petshop3.0,这些就可以总归为一个实体,而其中的信息都是这个类的属性,在其中住址、电话等信息又可以单独的归为一个实体,因为他们是描述个人具体信息的,并且是可变的(描述的不是很准确,可能有错误)。所以我们看到petshop3.0把这些信息归成一个AddressInfo实体,而该实体又成为AccountInfo实体的一个属性。具体应用的时候,这些实体都是作为一个整体使用,因为你总不能把一个人切开吧?再从c#的角度看,这些都是类型,可以看成用户的自定义类型,所以我们看到AddressUI这个用户控件把AddressInfo做为属性对外公开。
实体模型的使用贯穿了整个petshop3.0,从表面看,几乎每一层都引用了Model组件。还是以用户这块来说下去,表示层收集数据的时候,会把用户填的信息作为一个实体来收集,完成后用户接口处理组件会把信息实体做为参数传送给业务逻辑组件,业务逻辑部分再把信息实体做为参数经工厂传送给数据处理组件,在这里做最后处理,提交到数据库或返回错误。
在整个过程中,根本就不存在单独的值类型的传递。这样做的好处很明显,使逻辑操作更加透明和易于理解,便于构建复杂系统的模型,可以封装一些不需要向程序公开的信息,等等。
此类代码都处都是,一个比较明显的例子就是CartItemInfo,该实体模型表述放到购物车内的商品。该实体并不保存到数据库,完全是存在于进程中的。由于该实体的存在,大大简化了购物车这一抽象实体的组成。
实际上,在Model组件中根本就没有Cart这个实体。Cart的实现由BLL组件来完成。这个Cart并非和上面一样的瘦实体类,而是另外一种实体模型,因为它不仅包含着作为实体本身的信息,而且还有自己的行为。按照msdn上的叫法,这是“带有CRUD行为的业务实体”。我们可以把这个Cart看成一个智能机器人,他会自己挑选商品,并给出现在车内的信息。
通过类图来对比一下Cart和CartItemInfo。

      

CartItemInfo只有属性,而Cart则包括属性和方法。
要注意的是,Cart归属于业务逻辑组件,这是因为它的作用更多的是执行其行为,它的最主要的属性就是一个索引器,通过这个来获得CartItemInfo。

最后看一下CartItemInfo的代码,了解此类模型的基本构成。

/// <summary>
/// Business entity used to model items in a shopping cart
/// </summary>

[Serializable]
public class CartItemInfo {

private const string YES = "Yes";
private const string NO = "No";

// Internal member variables
private int _quantity = 1;
private bool _inStock = false;
private string _itemId = null;
private string _name;
private decimal _price;

/// <summary>
/// Default constructor
/// </summary>
/// <param name="itemId">Every cart item requires an itemId</param>

public CartItemInfo(string itemId) {
this._itemId = itemId;
}

/// <summary>
/// Constructor with specified initial values
/// </summary>
/// <param name="itemId">Id of item to add to cart</param></param>
/// <param name="name">Name of item</param>
/// <param name="inStock">Is the item in stock</param>
/// <param name="qty">Quantity to purchase</param>
/// <param name="price">Price of item</param>

public CartItemInfo(string itemId, string name, bool inStock, int qty, decimal price) {

this._itemId = itemId;
this._name = name;
this._quantity = qty;
this._price = price;
this._inStock = inStock;
}

// Properties
public int Quantity {
get { return _quantity; }
set { _quantity = value; }
}

public bool InStock {
get { return _inStock; }
set { _inStock = value; }
}

public decimal Subtotal {
get { return (decimal)(this._quantity * this._price); }
}

public string ItemId {
get { return _itemId; }
}

public string Name {
get { return _name; }
}

本文关键:学习PetShop3.0(6)实体模型
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top