8

DDD określa repozytorium dla każdego agregatu, ale przy korzystaniu z Wiosennego JPA danych możemy wykorzystać te korzyści tylko wtedy, gdy deklarujemy interfejs na jednostkę. W jaki sposób można rozwiązać tę niedopasowanie impedancji?Czy istnieje niezgodność między repozytoriami Design Domain Driven Design i Spring Data?

Mam nadzieję wypróbować interfejsy repozytorium zamknięte wewnątrz repozytorium zbiorczego, czy jest to rozwiązanie OK czy cokolwiek lepiej dostępne?

Aby dany przykład: Customer jest łączna korzeń i podmioty są jak Demographics, Identification, AssetSummary itp gdzie każda jednostka może skorzystać z posiadania własnych repozytorium interfejsów. Jaki jest najlepszy sposób bez gwałtownego naruszania DDD?

Odpowiedz

13

..., ale gdy obejmując Wiosna danych JPA, możemy wykorzystać korzyści tylko wtedy, gdy deklarujemy interfejs do jednego podmiotu ...

To źle i chciałbym dowiedzieć się, gdzie można dostać takie wrażenie z (dotyk swobodnie komentować). W repozytoriach Spring Data oczekiwane jest dokładnie to samo podejście do projektowania modelu domeny: identyfikujesz agregaty w swoim modelu domeny i tworzysz tylko interfejsy repozytoriów dla tych właśnie.

Twierdzę, że wszystko, co musisz zrobić, to zastosować koncepcję DDD do swojego modelu domeny. Po prostu nie zadeklaruj interfejsów repozytoryjnych dla encji, które nie są zagregowanymi źródłami. W rzeczywistości, jeśli je zadeklarujesz, w zasadzie łamiesz pojęcie agregatu, ponieważ rzeczywisty root nie może już kontrolować ograniczeń biznesowych, ponieważ inne jednostki mogą być manipulowane poprzez zdefiniowany dla nich interfejs repozytorium, tj. Bez użycia zagregowanego katalogu głównego.

Znajdź przykład tego poprawnie zastosowanego w tym Spring Data example. W nim Order jest zbiorczym korzeniem, LineItem jest zwykłym bytem. To samo dotyczy Customer (root) i Address (element zwykły). Interfejsy repozytoryjne istnieją tylko dla zagregowanych katalogów głównych.

W rzeczywistości ta konkretna relacja jest podstawową zasadą, która sprawia, że ​​moduły takie jak Spring Data REST działają w pierwszej kolejności. Udostępnia zasoby HTTP tylko dla zagregowanych korzeni, osadza zwykłe elementy w tworzonych reprezentacjach i tworzy łącza do innych agregatów.

+0

Dzięki za odpowiedź. Pojawiło się pytanie podczas próby rozważenia możliwości posiadania podmiotu jako części agregatu, który nie potrzebuje lub nie potrzebuje mapowania relacyjnego do zagregowanego korzenia, myślę, że można to osiągnąć poprzez niestandardowe repozytorium impl dla agregacji root, czy nie mam racji zakładając to? –

+0

Co więcej, gdy muszę przejść z takim impedem niestandardowym, mniej lub bardziej zaczynam rezygnować z zalet Spring Data (jeśli moje założenie, o którym była mowa powyżej), jest ważne. –

+1

Podmioty, które * nie są zawarte * w innym agregacie, mogą oczywiście uzyskać swoje repozytorium, także. Zwykle uważam je za agregat jednopodmiotowy, którego istotą jest sam zagregowany korzeń. Istotną częścią tego schematu jest to, że jednostek zawartych w agregacie nie wolno manipulować, chyba że poprzez agregat. W związku z tym nie każda jednostka JPA otrzymuje po jej stronie repozytorium danych sprężynowych. –