最近面向领域的知识挺火,我也来插一腿。说说我平时做项目时候用到的开发方式,以下代码为伪代码,主要展示一下我现在的开发方式供大家讨论,系统中不考虑持久、UI、AOP和IOC等方面内容。
说到.NET社区的“开发方式”就不得不提一下Petshop了,可以说Petshop真是影响了.NET的一代人。以至于三层成了.NET这边流行的标准的开发方式。但是要说一下Petshop是数据库驱动业务核心的过程式开发,也正是它也毒害了一批人。
下面我们以一个最常见也是大家比较熟的下定单来简单看一下。首先是系统的几个领域类:
应牧章的要求,加上类之间的关系:这里的关系很简单,Order与OrderItem是一对多关系;OrderItem与Product是一对多关系;定单提交业务Order对象是个“根”
我也就不解释了,发下几个类的代码里面有注解。大家看一下就明白了。这里我们要强调的是类关系,还有一个根的概念。每个业务流都会有一个根。而根不是整个系统唯一确定的是而是根据对象在哪个业务范围内而决定的。显然这里面是Order定单对象。
///
/// 商品
///
public class Product
{
///
/// 键
///
public int SysNo { get; set; }
///
/// 商品名称
///
public string ProductName { get; set; }
///
/// 商品价格
///
public decimal ProductPrice { get; set; }
private Category _category;
///
/// 所属分类
///
public Category Category
{
get { return _category; }
set { _category = value; }
}
} ///
/// 定单
///
public class Order
{
#region 属性
///
/// 键
///
public int SysNo { get; set; }
///
/// 定单ID
///
public string OrderId { get; set; }
///
/// 定单金额
///
public decimal OrderAmount { get; set; }
///
/// 运费金额
///
public decimal ShipAmount { get; set; }
///
/// 支付金额
///
public decimal PayAmount { get; set; }
///
/// 定单状态
///
public int OrderStatus { get; set; }
///
/// 定单时间
///
public DateTime OrderTime { get; set; }
private List _orderItems = new List();
///
/// 定单明细
///
public List OrderItems
{
get { return _orderItems; }
set { _orderItems = value; }
}
#endregion
#region 方法
///
/// 计算定单金额
///
///
public decimal GetOrderAmount()
{
decimal amount = 0;
//计算商品金额
foreach (var item in OrderItems)
{
amount += item.GetAmount();
}
//加上运费
amount += ShipAmount;
return amount;
}
#endregion
} ///
/// 定单明细
///
public class OrderItem
{
#region 属性
///
/// 键
///
public int SysNo { get; set; }
private Product _product = new Product();
///
/// 购买商品
///
public Product Product
{
get { return _product; }
set { _product = value; }
}
///
/// 购买价格
///
public decimal ProductPrice { get; set; }
///
/// 购买数量
///
public int ProductQty { get; set; }
#endregion
#region 方法
///
/// 主算小计金额
///
///
public decimal GetAmount()
{
return this.ProductPrice * Convert.ToDecimal(this.ProductQty);
}
#endregion
}///
/// 商品库存
///
public class Inventory
{
#region 属性
///
/// 键
///
public int SysNo { get; set; }
///
/// 更新键,用来保证更新的数据之前没有别人更新过。对应表的ModKey列,每更新一次更新Guid值
///
public Guid ModKey { get; set; }
private Product _product = new Product();
///
/// 商品
///
public Product Product
{
get { return _product; }
set { _product = value; }
}
///
/// 库存数量
///
public int Qty { get; set; }
#endregion
#region 方法
///
/// 验证库存是否有库存
///
///
public bool ValidInventory()
{
if (this.Qty > 0)
return true;
else
return false;
}
///
/// 减库存
///
///
public void MinusInventory(int qty)
{
if (this.Qty |