我想通過Repository
的示例瞭解六邊形體系結構。 在這個設置中,我有以下幾層:框架(基礎結構) - >應用程序 - >域。存儲庫中的六邊形體系結構
我有User
在域部分,可以說我想驗證User
如果沒有任何重複通過DuplicateUsernameValidator
。爲了獲得這些信息,我需要從某處獲得這些信息。我在域層再次添加了一個接口UserRepository
,這樣它可以在上面的層中解決。
這是對我來說很棘手的部分。我想要實現UserRepository
的邏輯,但對我來說,在應用程序層中實現這一點是沒有意義的,因爲持久化上下文位於基礎結構層(例如JdbcUserRepository
或JpaUserRepository
)。 但是,如果我正確理解六角形結構,則不能直接在我的基礎結構層中實現接口UserRepository
,因爲基礎結構層不應該知道域層。
我錯過了什麼?
有一件事我不明白是什麼把像'JpaUserRepository'實現在基礎設施層的點。例如,'User findByName(String userName)'方法將基本實現爲'qry = em.createQuery(「從用戶u中選擇u,其中u.name =?1」); qry.setParameter(1,userName);返回qry.getSingleResult();'。它只使用領域語言和抽象基礎結構API(JPA API和JP-QL DSL)。將其置於域層中會出現什麼問題,傳統的分層體系結構就是這種情況?是不是六角矯枉過正? –
當你考慮到許多真實世界的查詢不可避免地在其中嵌入業務邏輯時,它變得更加難以理解。例如:'從e選擇e從SomeEntity e其中e.status =:請求和不存在(...)'。其中一些查詢非常長,並嵌入了大量單獨的業務規則。將它們寫在域圖層外面看起來不太合適... –
我不認爲它是過度的。有很多原因可以避免將基礎設施細節放入核心域。主要的是:耦合。 將數據庫代碼放在自己的適配器中的優點是什麼? 很多: - 責任分離:如果我必須改變如何從我的數據庫中檢索數據,我不必修改相對於我的業務邏輯的類/模塊; - 個人「可發展性」:例如一個開發人員可以改善查詢性能,另一個開發人員可以解決業務邏輯問題,而不會出現大問題 –