例如:
代码
public class Order
{
private Guid _id;
private DateTime _creationDate;
private int _shippingMethod;
private int _status;
private List _orderItems;
public Guid Id
{
get { return _id; }
set { _id = value; }
}
public List OrderItems
{
get { return _orderItems; }
set { _orderItems = value; }
}
// Business Logic
public void Place()
{
// Validate order based on business rules to ensure it is in
// a good state to add to the database
// Check for stock availablity on items ordered
this.Add();
}
public void Cancel()
{
// Check to ensure this order can be canceled.
this.Status = Status.Cancelled();
this.Save();
}
public void ProcessOrder()
{
// Check to ensure this order can be processed.
// Validate order based on business rules
// Udpate the stock levels of products ordered
}
// Data Access Methods
public void Save()
{
// Code to persist changes to the database
}
public void Add()
{
// Code to Add this object to the database
}
public void Delete()
{
// Code to remove this object from the database
}
public static List FindAll()
{
// Code to retrive all Orders from the database
}
public static Order FindBy(Guid id)
{
// Code to retrive a specific Order from the database
}
}
上面的代码中,Order类包含了业务逻辑处理的代码,如Cancel, Process。通过这些方法也调用了数据访问代码来保存数据。
如果在开发的项目中,业务类和数据表是一一对应的关系,例如在开发博客或者论坛,Active Record方式就很合适。
相信很多的项目都是基于这个方式在开发和组织逻辑层,这个方式最大的弊端就是:数据库表只要改动,那么业务逻辑层动,而且这种变动会一直波及到了UI那端。
Domain Model
通过用这种方式来组织业务层的时候,业务层就只是关注把现实中的概念转换为相应的业务逻辑模型,不关注其他的方面。例如,在电子商务网站开发中,一些概念就被建模表示为一个个的业务模型(也就是业务类),Order, Shopping Cart, Customer等。而且和Active Record最大的区别就是:Domain Model中的业务类不是和表一一对应的,下图就是一个很好的例子:
|