8

DDD指定每個集合的存儲庫,但是當擁抱Spring Data JPA時,只有當我們聲明每個實體的接口時,才能利用好處。如何解決這種阻抗不匹配問題?域驅動設計庫和Spring數據庫之間是否存在不匹配?

我希望能夠嘗試封裝在聚合存儲庫中的存儲庫接口,這是一個好的解決方案或更好的可用?

爲了給出一個例子:Customer是聚合根和實體是像DemographicsIdentificationAssetSummary等等,其中每個實體可以從具有自己的資源庫接口受益。沒有太多違反DDD的最佳方法是什麼?

回答

13

...,但擁抱春天數據JPA的時候,只有當我們宣佈每個實體的接口,我們可以利用的好處...

這是不對的,我想學習,你得到這樣的印象(感覺免費評論)。 Spring數據存儲庫期望與您的域模型設計完全相同的方法:您可以識別域模型中的聚合,並僅爲這些聚合創建存儲庫接口。

我認爲你所需要做的就是將DDD概念應用到你的領域模型。不要聲明不是聚合根的實體的存儲庫接口。事實上,如果你聲明瞭這些,你基本上破壞了聚合的概念,因爲實際的根不能再控制商業約束,因爲其他實體可以通過爲它們定義的存儲庫接口進行操作,即不使用聚合根。

查找在此Spring Data example正確應用此示例。其中,Order是一個聚合根,LineItem只是一個普通的實體。這同樣適用於Customer(根)和Address(普通實體)。存儲庫接口只對聚合根存在。

事實上,這種特殊的關係是使Spring Data REST等模塊擺在首位的基本原理。它僅公開聚合根的HTTP資源,將普通實體嵌入到創建的表示中,並創建與其他聚合的鏈接。

+0

感謝您的回答。在嘗試考慮將實體作爲聚合的一部分的可能性時,我想到了這個問題,它不需要或不需要對聚合根進行關係映射,我想這可以通過定製存儲庫impl來實現根,我錯了假設? –

+0

此外,當我必須去使用這樣的自定義impl時,我或多或少地開始放棄Spring Data的好處(如果我上面假設的假設成立) –

+1

在另一個聚合中*未包含的實體當然可以獲取它們的存儲庫,太。我通常認爲它們是一個單一實體聚合體,實體就是聚合根本身。該模式的重要組成部分是,聚合中包含的實體不能被操縱,除非通過聚合。因此,並不是每個JPA實體都有一個Spring Data存儲庫。 –

相關問題