Ich habe in einer relativ komplexen Anwendung mit 10 Datenbanktabellen (Aggregate, Entitäten / Wertobjekte) gearbeitet und DDD angewendet. An diesem Punkt scheint es sich im Grunde genommen um DDD-Lite zu handeln, was bedeutet, dass es Anwendungs- / Domänendienste, das Domänenmodell (Entitäten, Wertobjekte) und Repositorys gibt.
Ich habe ein Buch über die Implementierung von DDD in die Hand genommen und als erstes erwähnte er DDD-Lite und Bounded Contexts und Domain Events, die als erste Fehler zu Beginn von DDD fehlen.
Derzeit habe ich versucht, das Domänenmodell nach Aggregatbeziehungen zu organisieren und Namespaces zu verwenden, um dies zu demonstrieren.
Ich kann die Vorteile und Nachteile der Aufteilung des Domain Model-Projekts in getrennte begrenzte Kontexte (noch) nicht erkennen. Vielleicht wird es später offensichtlich, aber ich hätte gerne ein Feedback aus der Praxis zu Bounded Contexts (und möglicherweise zu Subdomains usw., wenn sie damit verknüpft sind).
Antworten:
Stellen Sie sich ein Unternehmen vor, das verschiedene Abteilungen hat:
Können Sie ein Benutzermodell entwickeln, das alle diese Geschäftsbereiche ausdrucksstark abbildet? Überlegen Sie, wie die Benutzerentität in jeder Entität aussehen könnte. Vielleicht ist es in drei verschiedene Einheiten aufgeteilt:
Der Aufwand, einen Benutzer in jedem Kontext zu instanziieren, ist erheblich unterschiedlich. Vielleicht ist es so etwas:
entschuldigen Sie das Beispiel, es ist schwer, es genau zu veranschaulichen, ohne ein geeignetes Domänenmodell zu verwenden
Wenn Sie eine naive Implementierung und eine einzelne Benutzerentität verwenden, wird dies zu einem anämischen Datenmodell voller Getter und Setter, da Sie den Benutzer nicht überall vollständig darstellen können.
Es gibt klare Grenzen im Geschäft, daher ist es nützlich, diese so zu modellieren. Ein Benutzer, der sich im Vergleich zu einem Benutzer in einem Gehaltsabrechnungssystem anmeldet, und ein Benutzer, der ein Spiel spielt, sind alle sehr unterschiedlich, selbst wenn sie Teil desselben großen Systems sind.
Anders denken - Sie können jetzt Ihren Entwicklerverwaltungscode so erstellen, dass er sehr leicht und unabhängig vom Rest Ihres Systems ist. Es können genauere Typen mit weniger Gepäck verwendet werden, um die man sich sorgen muss. Dies ist der Schritt zum Aufbau kleinerer Subsysteme, die eventuell in eine eigene Anwendung extrahiert werden.
quelle
Employee
nicht einUser
, es hat einUser
. DiesUser
ist einfach eine Entität, über die sich eine Person anmelden und auf eine oder mehrere Anwendungen in der Organisation zugreifen kann. Und eineEmployee
hat nicht immer eineUser
. Außerdem erhalten Sie normalerweise keine einfache Bewerbung für verschiedene Abteilungen. In der Regel verfügt jede Abteilung über eigene Apps, die jeweils eigene Domain-Modelle enthalten. Daher hilft mir diese Antwort nicht, die Notwendigkeit zu verdeutlichen, getrennte begrenzte Kontexte in derselben Codebasis zu haben.Ich kann Ihnen ein anderes Beispiel geben. Angenommen, Sie haben ein E-Commerce-System. Sie würden dort Produkte haben, jedoch werden Produkte Teil von mindestens zwei verschiedenen Domänen sein:
Wenn Sie für beide Domänen einen begrenzten Kontext haben, kann Ihre Lösung schnell zu einem großen Schlammball werden, da Sie Querverweise erstellen. Am Ende haben Sie keine zwei Domains mehr. Ihr Produktinventar wird mit Produktkatalogreferenzen verwöhnt und umgekehrt. Infolgedessen können Sie eine Domain nicht ändern, ohne eine andere zu berühren, auch wenn Sie vollständig erkennen, dass dies nicht erforderlich ist. Ihre Modelle werden voneinander abhängig, eng miteinander verbunden und in schlechter Weise abhängig - abhängig von der Implementierung.
Wenn Sie jedoch zwei Kontexte haben, wirken sich alle Änderungen, die Sie in einer Domain vornehmen, nicht auf die andere Domain aus, sobald Sie Ihre Kommunikationskanäle frei halten. Dies bedeutet, dass Sie eine Duplizierung der Daten benötigen, dies ist jedoch der niedrigste Preis für eine lose gekoppelte komponentenbasierte Anwendung. Ihre Domains können über Domain-Ereignisse miteinander kommunizieren. Auch wenn Sie zu Beginn keine SOA-basierte Anwendung planen, können Sie mit relativ geringem Aufwand auf diese Ebene skalieren, da Sie nur den Transport für Ihre Domain-Ereignisse ändern und die Idee dabei unangetastet lassen.
Update: Es gibt einen guten Skillscast zu SkillsMatter von Eric Evans. Er gibt eine Analogie zur alten Geschichte, in der mehrere Blinde einen Elefanten aus ihrer Perspektive beschreiben. Da jeder Mann nur einen Teil des Elefanten berühren kann, beschreibt er ihn als "Baum", "Mauer", "Schlange", "Seil". Und jeder dieser Männer hat Recht in seinem Kontext. In einem begrenzten Kontext lebt die allgegenwärtige Sprache. Außerhalb des Kontexts haben diese Begriffe möglicherweise eine völlig andere Bedeutung, aber innerhalb des Kontexts ist die Sprache in mehreren Domänen gleich. Greg Young empfiehlt nachdrücklich, das Blaue Buch ab Kapitel 11 zu lesen, da dort die wichtigsten Grundbegriffe erläutert werden. Der Fokus auf taktische Muster am Anfang des Buches macht diesen "DDD-light" -Ansatz sehr verbreitet.
quelle
Product
Klassen beide hypothetisch dieselbe ID (z. B. haben beide separaten BC-Tabellen einen Fremdschlüssel für eine Tabelle mit einer einzelnen Produkt-ID). Vielleicht könnten sie bei der Kommunikation mit Domain-Ereignissen diese ID verwenden?