而且最主要的特點就是:每個業務類包含了很多的業務驗證,狀態跟蹤等。職責很單一,便於維護和理解。
示例代碼如下:
代碼
public class Order
{
private Guid _id;
public Guid Id
{
get { return _id; }
set { _id = value; }
}
public float ShippingCost()
{
return ShippingMethod.ShippingCostTo(this.DispatchAddress, this.ItemsTotalWeight());
}
public float Total()
{
return DiscountOffer.TotalPriceWithDiscountOfferAppliedTo(
this.Items, ShippingCost());
}
public void Process()
{
if (this.CanProcess())
{
// Charge the card
Customer.Card.Charge(this.Total());
// Set the status of the order
this.Status = Status.Shipped;
// Adjust the stock levels
foreach (OrderItem item in Items)
{
item.Product.DecreaseStockBy(item.QtyOrdered);
}
else
{
throw new InvalidOrderStateForOperationException(
String.Format(
"Order {0} cannot be processed in its current state {1}",
this.Id, this.Status.ToString());
}
}
public bool CanProcess()
{
if (!this.Status == Status.Shipped &&!this.Status = Status.Cancelled)
{
return (this.HasEnoughStockFor(me.Items) &&
GetBrokenRules.Count() == 0);
}
else
{
return false;
}
}
public List GetBrokenRules()
{
List brokenRules = new List();
if (Customer == null)
brokenRules.Add(new BrokenBusinessRule()
{
Property = "Customer",
Rule = "An Order must have a Customer"
});
else if (Customer.GetBrokenRules().Count >0)
{
AddToBrokenRulesList(brokenRules, Customer.GetBrokenRules());
}
if (DispatchAddress == null)
brokenRules.Add(new BrokenBusinessRule()
{
Property = "DispatchAddress",
Rule = "An Order must have a Dispatch Address"
});
else if (DispatchAddress.GetBrokenRules().Count >0)
{
AddToBrokenRulesList(brokenRules,
DispatchAddress.GetBrokenRules());
}
// ......
return brokenRules;
}
}
上面的代碼只是Order業務類的一部分代碼,但是從代碼中可以看出,這個類中包含了很豐富的業務邏輯。例如,在Process方法中,處理了下面的流程:
1.調用CanProcess 方法來進行下面的驗證:
a.Order的是否處於合適的可以被處理的狀態
b.在Order中訂購的物品是否有足夠的庫存
2.customer用戶給這個order付款。至於怎麼付款,這個邏輯就包含在了card類中。
3.然後,對産品的庫存進行更新。
可以看出,採用Domain Model方式很適合來來組織複雜的業務邏輯,而且代碼也很容易閱讀和理解(如果在加上重構)。
3.總結
通過上面的一些分析和解釋,不知道大家是否現在已經清楚:之前提出的問題如何解決。
一個建議就是:不要太形式化,根據項目的實際情況來。這句話可以使相當於廢話,但是很多的情況確實是這樣的,DDD不是萬能的,Transaction Script和Active Record也有它們的優勢,合適就好。
謝謝各位!
|