Wie man Grenzen eines begrenzten Kontexts klar definiert

9

Nachdem ich ungefähr einen Monat lang DDD gelesen und recherchiert hatte, beschloss ich, mein eigenes Projekt zu starten und DDD mit diesen begrenzten Kontexten zu erstellen

  • Kunden
  • Produkte
  • Aufträge
  • Abrechnung

Jeder begrenzte Kontext verfügt über eine Rest-API als Präsentationsschicht, Domänenschicht und persistente Schicht.

So weit so gut, Code läuft reibungslos, aber ich komme aus einer monolithischen Welt und versuche immer noch Folgendes herauszufinden:

  • Wenn ich einen neuen Kunden erstellen, eine neue Rechnung ausstellen und eine neue Bestellung erstellen möchte, möchte ich beispielsweise auf die Liste der Länder zugreifen. Muss ich:

a) Erstellen Sie eine Liste der Länder in jedem BC

b) Erstellen Sie eine Länder-BC -> API und verwenden Sie diese, um eine Liste der verfügbaren Länder zu erhalten

c) Verwenden Sie eine Drittanbieter-API und ziehen Sie Daten über die Antikorruptionsschicht in jedem BC

  • Welche Daten müssen bei der Integration in eine Drittanbieter-API mithilfe einer Antikorruptionsschicht oder einer Adapterschicht in mein Domänenmodell aufgenommen werden? Zum Beispiel, wenn ich eine zendesk-API in einen Client-BC integrieren möchte. Benötige ich nur eine Ticket-ID in meiner Domain oder muss ich alle Daten aus Zendesk extrahieren, auf die ich zugreifen und die ich in einem Client-BC verwenden möchte?

Wenn meine MVC-App tatsächlich Daten von APIs (Präsentationsebenen meiner begrenzten Kontexte) erhält, fällt es mir sehr schwer, die Grenzen jedes BC klar zu definieren. Bedeutet dies, dass ein ordnungsgemäß entworfener BC einen einzelnen MVC-Controller bedienen würde, ohne dass zusätzliche APIs verwendet werden müssten?

Dario Granich
quelle
2
Denken Sie daran, dass die Vervielfältigung von Daten in DDD kein Hauptanliegen ist ...
John

Antworten:

7

Wenn Ihre unterschiedlichen begrenzten Kontexte die Bedeutung / den Zweck eines Landes unterschiedlich verstehen, müssen Sie es in jedem Land entsprechend unterschiedlich modellieren. Wenn wir jedoch nur von Referenzdaten von ISO-Codes und -Namen sprechen, dann glaube ich, dass es ziemlich fair und standardmäßig ist, sie dort zu verstauen, wo es zweckmäßig ist, und sie allen interessierten Parteien zugänglich zu machen. Zum Beispiel: eine Datenbank, eine Konfigurationsdatei, ein Webdienst usw.

Ich wollte mir auch Ihr Modell ein wenig ansehen. Die von Ihnen aufgelisteten Stücke können je nach Unternehmensstruktur durchaus "Entitäten" in einem "begrenzten Kontext" sein. BCs werden häufig in verschiedenen Bereichen / Abteilungen / Teams definiert, da dies häufig die natürliche Grenze zwischen "allgegenwärtigen Sprachen" ist. Anstelle von Vertrieb / Produkten / Bestellungen würde ich beispielsweise erwarten, dass die BCs im Sinne von Vertrieb / Fertigung / Lagerung sind.

In diesen BCs konzentrieren Sie sich nicht auf die Substantive. Sie konzentrieren sich auf die Anwendungsfälle und erstellen Modelle der Substantive, die die Anwendungsfälle erfüllen können. Die Methoden auf einem "Aggregatstamm" führen Anwendungsfälle aus und nehmen die entsprechenden Änderungen an den zugehörigen Modellen vor.

... alle Modelle sind falsch, aber einige sind nützlich.

Denken Sie auch daran, dass jeder BC ein völlig anderes System oder eine andere Architektur verwenden kann. Ein bestimmter BC verdient möglicherweise überhaupt keine Verwendung von "DDD-Softwarekomponenten", und die meisten von ihnen tun dies wahrscheinlich nicht. Bei DDD geht es weniger um vorgeschriebene Softwarekomponenten als vielmehr um den Entwurf von Software. Der Punkt besteht darin, sich darauf zu konzentrieren, die begrenzten Kontexte des Unternehmens zu verstehen, die allgegenwärtigen Sprachen jedes Kontexts abzubilden und den Code für diesen Kontext unter Verwendung ihrer allgegenwärtigen Sprache zu modellieren. Auf diese Weise klingt es für sie so, als würden Sie in geschäftlichen Begriffen sprechen, die sie verstehen, wenn Sie mit Stakeholdern interagieren und sich auf den Kodex beziehen. Und zu erkennen, dass dasselbe Wort in verschiedenen BCs unterschiedliche Bedeutungen hat.

Es gibt bestimmte Muster, die von DDD hervorgebracht werden (z. B. Repository, bestimmte Ebenen usw.), die Mittel zum Zweck sind. Es ist jedoch nicht garantiert, dass diese Muster für jeden Fall die besten Muster sind, selbst innerhalb von DDD. Genau wie DDD ist nicht "die" Antwort für jedes Projekt. Sie müssen nur das tun, was Ihrer Analyse zufolge am praktischsten ist.

Kasey Speakman
quelle
3

Aufgrund Ihrer Fragen denke ich, dass Sie den begrenzten Kontext falsch verstehen. Vielleicht möchten Sie Kapitel 14 des blauen Buches noch einmal lesen .

Wenn Sie versuchen, allgemein zu antworten, müssen Sie vorsichtig sein, wenn Sie Konzepte zwischen zwei verschiedenen begrenzten Kontexten austauschen. Ein Grund dafür, dass die Grenze existiert, ist schließlich, dass sich die allgegenwärtige Sprache ändert. Die Annahme, dass dieselben Daten (und dieselbe Darstellung) einer Entität in beiden Kontexten verwendet werden können, ist naiv - es mag richtig sein, es kann falsch sein, aber es gibt keinen guten Weg für diejenigen von uns außerhalb, ohne Zugriff an Ihre Domain-Experten zu beurteilen.

In der Kundendomäne könnte "Land" beispielsweise mit dem Wohnsitz oder der Staatsbürgerschaft zusammenhängen. Bei der Abrechnung kann dies mit Wechselkursen zusammenhängen. In einigen dieser Domänen müssen Sie sich möglicherweise um Tarife und dergleichen kümmern.

Eine zweite Frage, die Sie stellen müssen, ist, welches Ihrer Modelle das Buch für die "gemeinsam genutzten" Daten ist. Im Fall von "Land" ist die richtige Antwort wahrscheinlich, dass keiner von ihnen ist! Die geopolitische Topologie wird nicht von Ihrem Modell gesteuert.

Was soll in Ihren Domain-Modellen passieren, wenn ein Land von einer fremden Macht besetzt ist?

Merken Sie sich; Viele von uns sind es gewohnt, über die Datenstruktur nachzudenken. Welche Beziehung besteht zwischen einem Datenelement und einem anderen? Und das ist großartig, wenn Sie Berichte berücksichtigen und sicherstellen möchten, dass alle benötigten Daten von Ihrer Lösung erfasst wurden. Bei Domain-Modellen geht es jedoch nicht nur um Struktur, sondern auch um Veränderung. Sie müssen Ihre Aufmerksamkeit auch auf diesen Teil richten und sicherstellen, dass Sie gut verstehen, wie die Daten die Änderungen einschränken (und wie diese Einschränkungen von einem begrenzten Kontext zum nächsten variieren).

VoiceOfUnreason
quelle
0

Die von Ihnen erwähnten Konzepte (Kunden, Produkte, Bestellungen, Abrechnung) werden normalerweise in einem einzelnen Domänenmodell und damit in einem begrenzten Kontext dargestellt. Ich schlage vor, Sie verstehen diese Konzepte falsch.

aryeh
quelle
Ich stimme dir nicht wirklich zu. Wenn Sie beispielsweise 1 Million Kunden haben, die 5 Millionen Rechnungen generieren, möchten Sie die Abrechnung von der Kundenverwaltung in verschiedene BCs aufteilen. Sie möchten Segmente Ihrer Domain entsprechend skalieren können. Darüber hinaus sollten Kunden und Abrechnung nicht eng miteinander verbunden sein, da es keinen wirklichen Grund dafür gibt. Trotz der Tatsache, dass Kasey Sales / Manufacturing / Warehousing als BCs vorschlägt, verfügt möglicherweise jeder dieser BCs über so komplexe Domänenmodelle, dass Sie BCs neu finden müssen.
Dario Granich
1 Million Kunden, die 5 Millionen Rechnungen erstellen, sind kaum typisch. Kleine bis mittlere KMU verfügen normalerweise über integrierte ERP-Systeme. Integrierte oder unabhängige (normalerweise Suite-basierte) Anwendungen für mittlere bis große KMU und Unternehmen. Wenn Ihre Umstände die Entwicklung einer Lösung unterstützen, die auf 4 komplexen Domänenmodellen basiert, und Sie damit umgehen können, ein großes Lob an Sie.
Aryeh
0

Mein Ansatz zu diesem Thema ist es, einen begrenzten Kontext mithilfe eines Business-Capability-Mappings oder anderer ähnlicher Techniken wie der Wertschöpfungskettenanalyse zu definieren . Es kommt auf folgende Schritte an:

  1. Definieren Sie die übergeordneten Verantwortlichkeiten oder Geschäftsfunktionen Ihres Systems. Ich denke, der beste Weg, dies zu tun, besteht darin, Schritte zu beschwören, die Ihr Unternehmen durchläuft, um einen Geschäftswert zu erzielen. Die logischen Grenzen, die Sie sich einfallen lassen, sind Ihre Geschäftsdienste oder, wenn Sie möchten, begrenzte Kontexte.
  2. Tauchen Sie tiefer in jeden Service ein.
  3. Identifizieren Sie die Kommunikation zwischen Ihren Diensten neben den ersten beiden Punkten.

Der anfängliche Fokus liegt also auf der Funktionsweise Ihres Unternehmens.

Einige praktische Ratschläge:

  1. Wenn einer Ihrer Kontexte / Dienste / usw. die Daten eines anderen Kontexts benötigt, sind Ihre Grenzen höchstwahrscheinlich falsch.
  2. Die höchst wünschenswerte Art der Kontextkommunikation ist ereignisbasiert. Dies ist ein Schlüssel zur Skalierbarkeit und Zuverlässigkeit. Wenn Sie synchrone Kommunikation benötigen, sind Ihre Grenzen höchstwahrscheinlich wieder falsch. Außerdem wird Ihr System durch synchrone Kommunikation zerstört.
  3. Ihre Domain ist letztendlich konsistenter als Sie denken. Genau wie bei allen anderen. Versuchen Sie nicht, alles 100% konsistent zu machen. Das hat keinen praktischen Sinn.
  4. Kontexte müssen nicht orchestriert werden. Sie sind in sich geschlossen. Wie Menschen.

Mit diesem Ansatz erhalten Sie hoch autonome, wartbare und zuverlässige Dienste. Möglicherweise möchten Sie ein Beispiel für die Definition von Kontextgrenzen überprüfen .

Vadim Samokhin
quelle