2012-06-14 33 views
1

我努力實踐領域驅動設計,代碼的基本結構包括以下對象:在DDD實踐,是CRUD方法應放在模型中的對象

Action->Facade-> 
Service 
Model 
Repository 

如果你認爲CRUD方法應放在模型就像下面:

order.save(new order()) 

或被放在門面就像下面:

addOrderFacade.save(new order()) 
+0

你是什麼意思「CRUD方法」?堅持/從永久存儲中重新存儲實體的方法? =>存儲庫。運行CRUD用例的方法? =>控制器或應用程序服務。通過CRUD操作更新實體的方法=>域圖層。 CRUD操作不會發生在1層的1種方法中,它們跨越幾個層次... – guillaume31

回答

2

我建議不要把它們放在域類,因爲

你的域類包可以在其他應用程序在您的DAO層將不同的地方重複使用,因此,最好是爲DAO

創建了模型的另一層
4

「保存」或「刪除」方法屬於存儲庫。通常,Save由服務或命令處理程序調用(如果您使用基於命令的方法更新域)。保存從CRUD處理CU,D得到它自己的方法,R部分是有趣的。

WH爲了更新它,R表示'GetEntity',那麼它可以是與Save相同的地方處理的域存儲庫(有超過1個存儲庫)的一部分。

但是,如果您要閱讀以顯示,基本上只是將查詢返回給用戶的查詢,則應該使用專用於查詢的不同存儲庫以及簡化的只讀模型。這個repo可以從控制器甚至UI中調用。

+1

用於在讀取操作上做出很好的區分 –

0

約定是將CRUD-方法放入存儲庫或服務層而不是模型中。事實上,當使用像Spring或Hibernate這樣的框架時,你會被引用來使用這種方法。單憑這個原因,它通常更容易:

  • 其他開發人員希望它
  • 框架支持
  • 教程和示例假設它

但是從設計的角度來看有較強的情況下這種做法是違背的。它導致了一個anemic domain model,換句話說,只有狀態和沒有行爲的結構(結構)完全公平地不是非常面向對象的。通過視圖,控制器,服務和存儲庫層需要大量的數據傳遞,並且需要大量的「開銷」代碼來將狀態和行爲集中在一起。對典範模型層缺乏關注也可能導致團隊之間的不匹配和零散模型。

一種試圖避免這種設計缺陷的方法通常被稱爲domain driven design,由Eric Evans定義。請注意,在DDD中,仍然有服務和存儲庫的位置,來自Wikipedia頁面:

  • 服務:當操作在概念上不屬於任何對象時。遵循問題的自然輪廓,您可以在服務中實施這些操作。服務理念在GRASP中被稱爲「純粹加工」。
  • 存儲庫:檢索域對象的方法應委託給專門的存儲庫對象,以便可以輕鬆地交換替代存儲實現。
  • 工廠:創建域對象的方法應該委託給一個專門的工廠對象,這樣可以輕鬆地交換替代實現。

如果您有興趣,請查看software tools支持DDD和(正下方)DDD示例應用程序。

+1

我不確定這裏的關聯。域對象中沒有CRUD方法並不一定意味着它是貧血症。除了CRUD,你還有很多其他類型的行爲。 另外,我同意實體的Create操作的一部分可以發生在該實體的Aggregate Root中。但是你肯定不會放入一個將實體直接添加到持久存儲的聚合根方法。這是一個Repository的工作。 – guillaume31

+0

正如我在答覆開始時指出的那樣,有爭論和反對。在這裏IMO的CRUD方法的位置不是全部問題。我們需要決定我們如何劃分責任,框架約定(由Java Bean推動)與開放的對象定向之間存在明顯的分歧。 –

相關問題