GO-DDD: Domänengesteuerte Designvorlage in Golang
Willkommen bei go-ddd , einem Referenz-Implementierungs-/Template-Repository, das den DDD-Ansatz (Domain Driven Design) in Golang demonstriert. Dieses Projekt soll Entwicklern und Architekten helfen, die DDD -Struktur zu verstehen, insbesondere im Kontext von GO, und wie sie zu saubereren, wartbaren und skalierbaren Codebasen führen kann.
Überblick
Das domänengesteuerte Design ist ein Methodik- und Designmuster, mit dem komplexe Unternehmenssoftware erstellt wird, indem die Implementierung mit einem sich entwickelnden Modell verbindet. go-ddd präsentiert dies, indem es einen einfachen Marktplatz aufstellt, auf dem Sellers Products verkaufen können.
Warum DDD?
- Allgegenwärtige Sprache : Fördert eine gemeinsame Sprache zwischen Entwicklern und Stakeholdern.
- Isolierung der Domänenlogik : Die Domänenlogik ist von der Infrastruktur- und Anwendungsschichten getrennt und fördert feste Prinzipien.
- Skalierbarkeit : Ermöglicht eine einfachere Microservices -Architekturübergänge.
Repository -Struktur

-
domain : Das Herz der Software, die Geschäftslogik und Regeln darstellt.-
entities : Grundlegende Objekte in unserem System wie Product und Seller . Enthält grundlegende Validierungslogik.
-
application : Enthält Anwendungsfallspezifische Operationen, die mit der Domänenschicht interagieren. -
infrastructure : Unterstützt die höheren Schichten mit technischen Funktionen wie Datenbankzugriff.-
db : Datenbankzugriff und Modelle. -
repositories : konkrete Implementierungen unserer Speicheranforderungen.
-
interface : Die externe Schicht, die wie API -Endpunkte mit der Außenwelt interagiert.-
api/rest : Handler oder Controller zum Verwalten von HTTP -Anforderungen und -Anantworten.
Weitere Prinzipien
- Domain
- Darf nicht von anderen Schichten abhängen.
- Bietet Infrastruktur mit Schnittstellen, darf jedoch nicht auf Infrastruktur zugreifen.
- Implementiert Geschäftslogik und Regeln.
- Führt Validierungen auf Unternehmen aus. Validierte Einheiten werden an die Infrastrukturschicht übergeben.
- Die Domänenschicht legt Standardeinstellungen von Entitäten fest (z. B. für ID- oder Erstellungszeitstempel). Legen Sie keine Standardeinstellungen in der Infrastrukturschicht oder sogar in der Datenbank fest!
- Lecken Sie Domänenobjekte nicht in die Außenwelt.
- Anwendung
- Der Klebercode zwischen der Domäne und der Infrastrukturschicht.
- Infrastruktur
- Repositorys sind dafür verantwortlich, eine Domänenentität in ein Datenbankmodell zu übersetzen und abzurufen. Hier wird keine Geschäftslogik ausgeführt.
- Implementiert Schnittstellen, die durch die Domänenschicht definiert sind.
- Implementiert die Persistenzlogik wie den Zugriff auf eine Postgres- oder MySQL -Datenbank.
- Lesen Sie beim Schreiben in Speicher die schriftlichen Daten, bevor Sie diese zurückgeben. Dies stellt sicher, dass die Daten korrekt geschrieben werden.
Best Practices
- Geben Sie keine validierten Entitäten aus den Lesemethoden im Repository zurück. Geben Sie stattdessen den Domänenentitätstyp direkt zurück.
- Validierungen können sich in Zukunft ändern, und Sie möchten nicht alle Daten in Ihrer Datenbank ändern.
- Andernfalls können Sie keine Daten aus der Datenbank lesen, die mit einer anderen Validierungslogik geschrieben wurde.
- Setzen Sie keine Standardwerte (z. B. aktueller Zeitstempel oder ID) in die Datenbank ein. Stellen Sie sie aus mehreren Gründen in die Domänenschicht (Fabrik!) Stellen:
- Es ist ziemlich gefährlich, zwei Quellen der Wahrheit zu haben.
- Es ist einfacher, die Domänenschicht zu testen.
- Datenbanken können ersetzt werden, und Sie möchten nicht alle Ihre Standardwerte ändern müssen.
- Lesen Sie die Entität immer nach dem Schreiben in der Infrastrukturschicht.
- Dies stellt sicher, dass die Daten korrekt geschrieben werden und wir nie mit abgestandenen Daten arbeiten.
-
find vs get :-
find Methoden können NULL oder eine leere Liste zurückgeben. -
get Methoden müssen einen Wert zurückgeben. Wenn der Wert nicht gefunden wird, werfen Sie einen Fehler.
- Löschen: Verwenden Sie immer eine weiche Löschung. Erstellen Sie eine Spalte
deleted_at in Ihrer Datenbank und setzen Sie sie beim Löschen einer Entität auf den aktuellen Zeitstempel. Auf diese Weise können Sie die Entität bei Bedarf immer wiederherstellen.
Erste Schritte
- Klonen Sie dieses Repository:
git clone https://github.com/sklinkert/go-ddd.git
cd go-ddd
go mod download
go run ./...
Beiträge
Beiträge, Probleme und Feature -Anfragen sind willkommen! Überprüfen Sie die Seite mit der Ausgabe.
Lizenz
Unter der MIT -Lizenz verteilt. Weitere Informationen finden Sie unter Lizenz.