在一個領域驅動的設計中,你要尋找一個非貧血域模型,你如何決定在你的域對象和麪向服務的方法中實現什麼?您的域模型對象中包含什麼以及您的服務中包含了哪些內容?
編輯:我這問不同的方式用一個例子,並得到更好的答案here
在一個領域驅動的設計中,你要尋找一個非貧血域模型,你如何決定在你的域對象和麪向服務的方法中實現什麼?您的域模型對象中包含什麼以及您的服務中包含了哪些內容?
編輯:我這問不同的方式用一個例子,並得到更好的答案here
DDD的想法是,領域模型包含您的數據和大部分的業務邏輯。這些服務通常處理這些結構的持久性。
然後就是所有那些業務流程由多個步驟組成的情況,這些步驟總是更改/修改域對象。您通常使用服務來實現某個過程。所以通常你用服務的結果更新域對象。你從來沒有讓域對象實現自己調用服務!
所以它經常見到這樣的代碼:
if (order.isValidForPurchase() && orderValidatorService.isValidOrder(order))
orderService.order(order)
很簡單,因爲真理的部分是衆所周知的訂單對象,以及一些需要知道orderValidatorService
外部數據。可以說這兩行代碼也可以在orderService.order
方法中。
我認爲總是有必要研究這些過程中存在多少個域對象;有時候通過制定更多的概念可以獲得比您最初想象的更多的東西。這實際上是業務流程狀態和對象模型的交集。通常DDD模型往往試圖從過度結構的角度來捕捉域,IMO忽略了一些核心過程。所以如果你過於結構化,我認爲你做了一個Order
對象。如果您添加過程,您可能會製作ShoppingCartOrder
,UnshippedOrder
,ShippedOrder
,BilledOrder
和HistoricalOrder
。這也使您的服務整合變得更簡單。