在嘗試理解領域驅動設計時,我不斷回到一個我似乎無法明確回答的問題。邏輯何時屬於業務對象/實體,它何時屬於服務?
如何確定屬於某個域實體的邏輯以及屬於某個域服務的邏輯?
例子: 我們有一個在線商店的訂單類。這個類是一個實體和一個聚合根(它包含OrderItems)。
Public Class Order:IOrder
{
Private List<IOrderItem> OrderItems
Public Order(List<IOrderItem>)
{
OrderItems = List<IOrderItem>
}
Public Decimal CalculateTotalItemWeight()
//This logic seems to belong in the entity.
{
Decimal TotalWeight = 0
foreach(IOrderItem OrderItem in OrderItems)
{
TotalWeight += OrderItem.Weight
}
return TotalWeight
}
}
我想大多數人會同意CalculateTotalItemWeight屬於實體。但是,在某些時候,我們必須將此訂單運送給客戶。要做到這一點,我們需要做兩件事:
1)確定運送此訂單所需的郵資費率。
2)確定郵資費率後打印運輸標籤。
這兩項操作都需要依賴那些Order實體外,如外部Web服務來檢索郵政資費。我們應該如何完成這兩件事?我看到幾個選項:
1)直接在域實體中編碼邏輯,如CalculateTotalItemWeight。然後我們打電話給:
Order.GetPostageRate
Order.PrintLabel
2)將邏輯放入接受IOrder的服務中。然後,我們稱之爲:
PostageService.GetPostageRate(Order)
PrintService.PrintLabel(Order)
3)創建爲在訂單操作每個動作類,並通過構造函數注入傳遞類的實例,以訂單(這是選項1的變化,但允許重複使用在RateRetriever和LabelPrinter類):
Public Class Order:IOrder
{
Private List<IOrderItem> OrderItems
Private RateRetriever _Retriever
Private LabelPrinter _Printer
Public Order(List<IOrderItem>, RateRetriever Retriever, LabelPrinter Printer)
{
OrderItems = List<IOrderItem>
_Retriever = Retriever
_Printer = Printer
}
Public Decimal GetPostageRate
{
_Retriever.GetPostageRate(this)
}
Public void PrintLabel
{
_Printer.PrintLabel(this)
}
}
其中的這些方法,你選擇這個邏輯之一,如果有的話?你選擇的理由是什麼?最重要的是,是否有一套指導方針讓你選擇?
訂單難言不可知關於其的OrderDetail項目......是你的意思? – 2011-01-29 23:43:23