Eu as recomanda Domain-Driven Design Distilled: https://www.amazon.com/Domain-Driven-Design-Distilled-Vaughn-Vernon/dp/0134434420 inainte de toate. Apoi Red book of DDD. Bule book m-a adormit.
@Cosmin_Popescu Vorbind despre frameworkuri, si stiind ca tu esti in ecosystemul java, as zice ca la inceput sa privesti proiectul tau(atentie, nu framework-ul) ca 3 layere concentrice.
Alistair Cockburn a venit prima oara cu termenul de arhitectura hexagonala in 2005, iar layerele aratau cam asa:
Directia dependentelor este de la exterior la interior.
La interior, in cercul galben, Domain adica, vei avea Entitatile, interfetele pentru repository(nu implementarea repository) si arguably domain events.
Fizic, vei face un folder Domain, sa zicem. Iar clasele java din interiorul domain nu ar trebui sa foloseasca nimic din exterior sau din alt layer al proiectului, decat poate tot din interiorul Domain.
Exemplu: Entitati ca peste tot gen User.java, Document.java, Video.java insa fara adnotari sau alte importuri de spring aici.
Mai departe, cercul rosu este cercul cu Use Cases. Unii il mai numesc Application Services. Fizic este si el un folder cu niste clase. Ce ar trebui sa fie aici? Gandeste-te la cum se livra software-ul in anii 2000. Daca cumparai Ms Word pe un CD, pe spatele CD-ului vedeai ce stie sa faca acel software. Stie sa creze un document, sa il editeze, stie sa printeze un document, sa il trimita pe mail, sa modifice fontul textului, etc. In cercul de use cases pui exact asta.
Exemplu: CreateDocumentService.java, PrintDocumentService.java.
Spring boot sau Symfony sau Laravel in cazul nostru, se regasesc in partea de Infrastructura. Partea Verde.
Mai departe avem cercul verde si cercul albastru. Adica Infrastructura. Aici gasesti controllerele, si tot ce tine de frameworks. Aici vei avea Spring Boot. Controllerele sunt ok sa aibe adnotari, dar se vor reasi in acest layer obligatoriu. E ok sa se importe din Domain sau Use-case. Aici avem si repository care se leaga la baza de date si implementeaza ce ai in interfetele din Domain. Repository aici este cel care se va folosi de un ORM(Hibernate, Doctrine in cazul Symfony, etc). Aici se regaseste si UI-ul aplicatiei. Sau CLI client daca e cazul.
DDD vine cumva ca o manusa pentru arhitectura hexagonala. As zice ca este o evolutie care include si partea de ubiquitous language. Dar nu o sa intram in detalii acum.
Sper ca ti-am raspuns cat de cat la intrebare.
Exemple de cod:
Java: GitHub - CodelyTV/java-ddd-example: ☕🎯 Hexagonal Architecture + DDD + CQRS in a Java project using SpringBoot + skeleton GitHub - CodelyTV/java-basic-skeleton: ☕🚀 Java Bootstrap: Skeleton for your new projects
PHP: GitHub - CodelyTV/php-ddd-example: 🐘🎯 Hexagonal Architecture + DDD + CQRS in PHP using Symfony 6 + skeleton GitHub - CodelyTV/php-basic-skeleton: 🐘🚀 PHP Basic Skeleton: Bootstrap your new projects using this Composer Project
Typescript: GitHub - CodelyTV/typescript-ddd-example: 🔷🎯 TypeScript DDD Example: Complete project applying Hexagonal Architecture and Domain-Driven Design patterns + skeleton GitHub - CodelyTV/typescript-basic-skeleton: 🔷🌱 TypeScript Basic Skeleton: Bootstrap your new TypeScript project with the bare minimum dependencies