回答

2

我想這取決於你將如何依靠他們。

問題是 - 你是否會允許自己從域內使用存儲庫?
如果是這樣 - 那麼你被迫把它們放進去。

我自己喜歡把它們放在域外。所以 - 典型的生命週期看起來像這樣=>

UI => Controller =>通過聚合根檢索聚合根=>通過聚合根=>調用邏輯如果創建新聚合根,將其添加到回購。

有時候控制器會調用應用程序服務,除了檢索root和調用函數之外,它還會執行一些額外的工作。但想法是一樣的 - 域名對持久性一無所知。


雖然(在我看來)沒有什麼錯把回購域(或至少其中的抽象),它使您的域名更清楚的持久性。有時候,這可以解決問題,但通常情況下 - 這肯定會使您的域更加複雜。

使用看起來更自然的東西,隨時準備好切換你的方式。

+0

我會說這取決於我們是否需要分層架構與否;如果我們這樣做,那麼就沒有選擇:存儲庫進入領域層。 – 2015-04-09 20:59:04

14

存儲庫接口是域的一部分。接口的實際實現應該是基礎結構的一部分。

+0

好吧。這些接口是域的一部分,因爲它定義了DO可以訪問的合同。它經常被忽視。 – 2010-09-03 11:50:12

+0

定義分層架構的規則如何(請參閱我的答案)? – 2015-04-09 20:57:54

+1

優秀的問題。存儲庫接口是在域層和基礎結構層之間共享的數據定義模塊中定義的。它意味着一種輕鬆分層的形式。正如「軟件體系結構模式」一書中所述, 39:»J層提供的函數的參數,返回和錯誤類型應該是編程語言的內置類型,層J中定義的類型或從共享數據定義模塊中獲取的類型。請注意,層之間共享的模塊放寬了嚴格分層的原則。« – 2015-04-11 05:34:36

4

存儲庫實現類以及單獨的接口(如果存在的話)應該進入域層

原因是分層體系結構遵循的基本原則:下層不能依賴更高層

如果我們接受這個規則(否則它不是分層架構),那麼將存儲庫實現放入基礎架構層會使其依賴於域層,因此違反了分層的基本規則。

例如,當我們創建一個新的域實體時,我們把它放在域圖層中;並且由於存儲庫(其接口及其實現)必然依賴於域實體,這意味着存儲庫也必須進入領域層。否則,只要在域圖層中添加/刪除/修改域實體,我們就會更改基礎架構層。

其他問題(如保持域層「乾淨」且獨立於持久性細節)可以並且應該通過使用域層內實現的適當基礎設施服務來實現。例如,在Java中,我們可以使用JPA以很少的代碼實現存儲庫,並且不需要SQL/JDBC或特定於數據庫的代碼(使用JPA實現存儲庫是否是一個好主意是另一個討論;無論如何,JPA實體將反正使用JPA註釋)。

參考文獻:WikipediaMSDN

相關問題