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?
quelle
Antworten:
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.
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.
quelle
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).
quelle
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.
quelle
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:
Der anfängliche Fokus liegt also auf der Funktionsweise Ihres Unternehmens.
Einige praktische Ratschläge:
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 .
quelle