DDD-gebundene Kontexte und Domänen?


16

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).


Es scheint mir, dass das einzige, was getrennte begrenzte Kontexte definiert, die Notwendigkeit ist, die Linguistik und die damit verbundenen betrieblichen Unterschiede zu unterscheiden, dh es heißt Produkt in einem Bereich und Produkt in einem anderen Bereich, aber sie sind unterschiedlich. Es darf nicht dasselbe Modell sein (gleicher Name usw.). Warum ändern wir nicht einfach die Namen, um ihre subtil unterschiedliche Semantik darzustellen? Sie könnten ein Modell haben, um sie alle zu regieren. Subdomains sind natürlich, aber ich sehe im Moment keine begrenzten Kontexte. Ich denke nur laut nach ...
Ashley Aitken

Ich denke, Sie haben bereits begriffen, warum es sich lohnt, Ihre Domain nach Kontexten aufzuteilen. Was jetzt also nützlich sein könnte, ist die richtige Art, sie zu identifizieren und die Grenzen des Kontexts zu definieren. So mache ich das: medium.com/@wrong.about/…
Zapadlo

Antworten:


20

Stellen Sie sich ein Unternehmen vor, das verschiedene Abteilungen hat:

  • Software-Entwicklung
  • HR
  • Buchhaltung

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:

  • Entwickler
  • Mitarbeiter
  • Zahlungsempfänger

Der Aufwand, einen Benutzer in jedem Kontext zu instanziieren, ist erheblich unterschiedlich. Vielleicht ist es so etwas:

  • neuer Mitarbeiter (ssn, name, joindate, geburtsdatum, gender)
  • neuer Entwickler (Mitarbeiter, Arbeitsstation, Anmeldeinformationen)
  • neuer Zahlungsempfänger (Mitarbeiter, Rolle)

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.


Vielen Dank für das unterstützende Beispiel, das die unterschiedlichen Bedürfnisse der 3 BCs verdeutlicht.
lko

Nicht so, wie ich es gewohnt bin, diese Konzepte zu sehen: Normalerweise ist ein Employeenicht ein User, es hat ein User. Dies Userist einfach eine Entität, über die sich eine Person anmelden und auf eine oder mehrere Anwendungen in der Organisation zugreifen kann. Und eine Employeehat nicht immer eine User. 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.
Rogério

@ Rogério dein Einwand ist eigentlich ein schönes Beispiel dafür, warum es wichtig ist, die allgegenwärtigen Sprachen, die in jedem begrenzten Kontext verwendet werden, richtig zu definieren :)
MauganRa

Ich frage mich nur, ob wir in den Fällen, in denen wir ein Kundenverwaltungssystem haben, wenn wir telefonisch Bestellungen abfragen oder Rechnungen stellen usw., in die Warteschleife geraten, während wir an die entsprechende Abteilung weitergeleitet werden. Das Domänenwissen jeder Abteilung spielt eine Rolle - sehr zum Ärger des Kunden in diesen Szenarien. Vielleicht können wir DDD dafür verantwortlich machen, dass die Trennung zwischen diesen Kontexten erzwungen wurde.
Andez

16

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:

  • Produktkatalog, in dem Sie Ihre Produktbeschreibung und alle Attribute aufbewahren
  • Inventar, in dem Sie den Lagerbestand des Produkts haben

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.


1
+1, um auch die Vervielfältigung aufzurufen. es ist zunächst ein wenig verwirrend ("mache ich das falsch ?!), aber es ist völlig natürlich, in vielen Fällen auch erforderlich.
Adrian Schneider

In diesem Szenario haben diese ProductKlassen 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?
lko

1
Es hängt alles davon ab, welcher Speicher gewählt wird. Es ist nicht erforderlich, die technische ID zu verwenden, um domänenübergreifend zu verweisen. Es ist auch nicht ratsam, kontextübergreifend zu kommunizieren.
Alexey Zimarev

1
Anscheinend ist es an der Zeit, das blaue Buch aus dem Regal zu holen und die späteren Kapitel zu lesen
Markus Pscheidt,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.