存儲庫類應該放入哪一層?域或基礎架構?儲存庫應該放入哪一層?
回答
我想這取決於你將如何依靠他們。
問題是 - 你是否會允許自己從域內使用存儲庫?
如果是這樣 - 那麼你被迫把它們放進去。
我自己喜歡把它們放在域外。所以 - 典型的生命週期看起來像這樣=>
UI => Controller =>通過聚合根檢索聚合根=>通過聚合根=>調用邏輯如果創建新聚合根,將其添加到回購。
有時候控制器會調用應用程序服務,除了檢索root和調用函數之外,它還會執行一些額外的工作。但想法是一樣的 - 域名對持久性一無所知。
雖然(在我看來)沒有什麼錯把回購域(或至少其中的抽象),它使您的域名更清楚的持久性。有時候,這可以解決問題,但通常情況下 - 這肯定會使您的域更加複雜。
使用看起來更自然的東西,隨時準備好切換你的方式。
存儲庫接口是域的一部分。接口的實際實現應該是基礎結構的一部分。
好吧。這些接口是域的一部分,因爲它定義了DO可以訪問的合同。它經常被忽視。 – 2010-09-03 11:50:12
定義分層架構的規則如何(請參閱我的答案)? – 2015-04-09 20:57:54
優秀的問題。存儲庫接口是在域層和基礎結構層之間共享的數據定義模塊中定義的。它意味着一種輕鬆分層的形式。正如「軟件體系結構模式」一書中所述, 39:»J層提供的函數的參數,返回和錯誤類型應該是編程語言的內置類型,層J中定義的類型或從共享數據定義模塊中獲取的類型。請注意,層之間共享的模塊放寬了嚴格分層的原則。« – 2015-04-11 05:34:36
存儲庫實現類以及單獨的接口(如果存在的話)應該進入域層。
原因是分層體系結構遵循的基本原則:下層不能依賴更高層。
如果我們接受這個規則(否則它不是分層架構),那麼將存儲庫實現放入基礎架構層會使其依賴於域層,因此違反了分層的基本規則。
例如,當我們創建一個新的域實體時,我們把它放在域圖層中;並且由於存儲庫(其接口及其實現)必然依賴於域實體,這意味着存儲庫也必須進入領域層。否則,只要在域圖層中添加/刪除/修改域實體,我們就會更改基礎架構層。
其他問題(如保持域層「乾淨」且獨立於持久性細節)可以並且應該通過使用域層內實現的適當基礎設施服務來實現。例如,在Java中,我們可以使用JPA以很少的代碼實現存儲庫,並且不需要SQL/JDBC或特定於數據庫的代碼(使用JPA實現存儲庫是否是一個好主意是另一個討論;無論如何,JPA實體將反正使用JPA註釋)。
- 1. 我應該實現哪一層緩存
- 2. Subversion存儲庫應該在哪裏?
- 3. 我應該在哪裏做映射的東西?存儲庫或服務層?
- 4. 我應該放置哪一層.edmx和生成的POCO類?
- 5. asp.net mvc3,我應該把我的代碼放在哪一層?
- 6. 域模型應該在哪一層?
- 7. DBContext,Repository和UnitOfWork應該在哪一層?
- 8. 哪一層應該有我的DataContracts?
- 9. 哪一層應該包含AutoMapper配置?
- 10. 域驅動設計 - 我們應該在哪裏放置存儲庫?
- 11. ASP.NET MVC2 LINQ - 存儲庫模式,分頁代碼應該放在哪裏?
- 12. 我的Azure雲服務存儲文件應該放在哪裏?
- 13. 我應該將兩個實體放在服務層,存儲庫層,還是爲兩者的連接建立一個存儲庫?
- 14. 我應該在哪裏存儲len(list)?
- 15. 我應該在哪裏存儲公鑰?
- 16. 應該在哪裏存儲繼承類?
- 17. 我應該在哪裏存儲「MemberID」?
- 18. 我應該在哪裏存儲cookie?
- 19. 我應該在哪一層加入2個實體?
- 20. JCR與CMIS:我應該使用哪個存儲庫API?
- 21. FMDataBase - 我應該在哪裏存儲數據庫文件?
- 22. 我應該在哪裏存儲全局數據庫實例?
- 23. 哪個CDI範圍應該是首選的JPA存儲庫
- 24. 公共Web目錄應該包含哪些git存儲庫?
- 25. 我應該在哪裏存儲不在macports下載的庫?
- 26. 模型解析器在MVC中應該有哪一層應該是什麼層
- 27. 庫和媒體文件應該存儲在存儲庫中嗎?
- 28. 哪些SQL應該用於庫存表
- 29. 哪一層應該在n層架構中測試
- 30. 我應該導入哪個片段庫?
我會說這取決於我們是否需要分層架構與否;如果我們這樣做,那麼就沒有選擇:存儲庫進入領域層。 – 2015-04-09 20:59:04