Domain-Driven Design (DDD) ist ein Ansatz zur Gestaltung von Softwaresystemen, der sich auf das Fachgebiet und dessen Logik konzentriert. DDD zerlegt komplexe Fachgebiete in verwandte, aber unabhängige begrenzte Kontexte (bounded contexts). In jedem Kontext wird eine eigene Sprache (Ubiquitous Language) entwickelt, die mit den Fachexperten abgestimmt ist. Die Hauptbausteine von DDD:
Begrenzte Kontexte stellen oft separate Mikrodienste dar, die über klar beschriebene APIs oder Ereignisse miteinander interagieren.
Beispielcode in Java (Spring):
// Beispiel Value Object @Embeddable public class Address { private String city; private String street; // ... Konstruktoren, equals, hashCode } // Beispiel Entity mit Aggregate Root @Entity public class Order { @Id private Long id; @Embedded private Address deliveryAddress; // ... Geschäftslogik }
Wichtige Merkmale:
Sind alle Objekte in DDD Entities?
Nein, es gibt auch Value Objects – diese haben keine Einzigartigkeit, ihr Zustand bestimmt vollständig die Identität.
Address a1 = new Address("Moskau", "Arbat"); Address a2 = new Address("Moskau", "Arbat"); System.out.println(a1.equals(a2)); // true
Bedeutet die Zerlegung in Mikrodienste die Anwendung von DDD?
Nein, man kann DDD auch innerhalb einer monolithischen Anwendung anwenden, indem man interne Kontextgrenzen aufbaut.
Braucht man immer ein Repository für jedes Aggregat?
Normalerweise ja, aber manchmal kann ein Aggregat vollständig als Teil eines anderen Aggregats gespeichert werden, wenn es nicht die Wurzel einer separaten Geschäftstransaktion ist.