Mein Unternehmen schreibt unsere Webanwendung von Grund auf neu. Es ist eine große Anwendung auf Unternehmensebene mit einer komplexen Domäne in der Finanzbranche.
Wir verwenden ein ORM (Entity Framework) für die Persistenz.
Im Wesentlichen konzentriert sich die Hälfte unserer Anwendung darauf, Rohdaten vom Benutzer zu sammeln, zu speichern, und die andere Hälfte der Anwendung, die den größten Teil unserer tatsächlichen Domänenlogik enthält, verwendet diese Rohdaten, um unser Domänenbild zu erstellen, das sich stark von den ursprünglichen unterscheidet Roheingaben und Übergabe an eine Calc-Engine, Ausführen von Calcs und Ausspucken von Ergebnissen, die dem Benutzer dann angezeigt werden.
Bei einem DDD-Ansatz unter Verwendung von Schichten scheinen CRUD-Operationen die Domänenschicht zu durchlaufen. aber zumindest in unserem Fall scheint dies keinen Sinn zu ergeben.
Wenn ein Benutzer zum Bearbeitungsbildschirm wechselt, um beispielsweise ein Anlagekonto zu ändern, sind die Felder auf dem Bildschirm die genauen Felder, die in der Datenbank gespeichert sind, nicht die später für Berechnungen verwendete Domänendarstellung. Warum sollte ich die Domänendarstellung des Anlagekontos laden, wenn der Bearbeitungsbildschirm die Datenbankdarstellung (Roheingaben) benötigt?
Nachdem der Benutzer auf dem Bildschirm des Anlagekontos auf "Fertig" geklickt hat und ein POST an den Controller gesendet wurde, verfügt der Controller nun über eine ziemlich genaue Datenbankdarstellung des zu speichernden Anlagekontos. Aber aus irgendeinem Grund sollte ich die Domänendarstellung laden, um Änderungen vorzunehmen, anstatt nur das Modell des Controllers direkt dem Datenbankmodell zuzuordnen (Entity Framework-Modell).
Im Wesentlichen ordne ich ein Datenmodell dem Domänenmodell zu, damit es dann wieder dem Datenmodell zugeordnet werden kann, um zu bestehen. Wie macht das Sinn?
Kurze Antwort: nicht .
Längere Antwort: Die Schwergewichtsmuster für die Entwicklung eines Domänenmodells gelten nicht für die Teile Ihrer Lösung, die nur eine Datenbank sind.
Udi Dahan hatte eine interessante Beobachtung , die helfen könnte, dies zu klären
Der Zweck des Domänenmodells besteht schließlich darin, sicherzustellen, dass alle Aktualisierungen der Daten die aktuelle Geschäftsinvariante beibehalten. Oder anders ausgedrückt: Das Domänenmodell ist dafür verantwortlich, dass die Datenbank, die als Aufzeichnungssystem fungiert, korrekt ist.
Wenn Sie mit einem CRUD-System arbeiten, sind Sie normalerweise nicht das Aufzeichnungssystem für die Daten. Die reale Welt ist das Buch der Aufzeichnungen, und Ihre Datenbank ist nur eine lokal zwischengespeicherte Darstellung der realen Welt.
Zum Beispiel haben die meisten Informationen, die in einem Benutzerprofil angezeigt werden, wie eine E-Mail-Adresse oder eine von der Regierung herausgegebene Identifikationsnummer, eine Wahrheitsquelle, die außerhalb Ihres Unternehmens liegt - es ist der E - Mail-Administrator eines anderen, der E-Mail-Adressen zuweist und widerruft, nicht Ihre App. Es ist die Regierung, die SSNs zuweist, nicht Ihre App.
Daher werden Sie normalerweise keine Domain-Validierung für die Daten durchführen, die von außen zu Ihnen kommen. Möglicherweise sind Überprüfungen vorhanden, um sicherzustellen, dass die Daten gut geformt und ordnungsgemäß bereinigt sind . Aber es sind nicht Ihre Daten - Ihr Domain-Modell erhält kein Veto.
Das ist richtig für den Fall, dass die Datenbank das Buch der Aufzeichnung ist .
Ouarzy drückte es so aus .
Wir verwenden das Domänenmodell, um die Daten zu verwalten, die zur Domäne gehören. Die Daten von außerhalb der Domain werden bereits an einem anderen Ort verwaltet - wir speichern nur eine Kopie zwischen.
Greg Young verwendet Lagersysteme als primäres Beispiel für Lösungen, bei denen sich das Buch der Aufzeichnung an einem anderen Ort befindet (dh in der Lagerhalle). Die Implementierung, die er beschreibt, ist Ihrer sehr ähnlich - eine logische Datenbank zum Erfassen von Nachrichten, die vom Warehouse empfangen wurden, und eine separate logische Datenbank, in der die aus der Analyse dieser Nachrichten gezogenen Schlussfolgerungen zwischengespeichert werden.
Vielleicht. Ich würde es nur ungern als begrenzten Kontext kennzeichnen, da nicht klar ist, welches andere Gepäck damit einhergeht. Es kann sein, dass Sie zwei Kontexte haben, es kann ein Kontext mit subtilen Unterschieden in der allgegenwärtigen Sprache sein, die Sie noch nicht aufgegriffen haben.
Möglicher Lackmustest: Für wie viele Domain-Experten benötigen Sie zwei Domain-Experten, um dieses Spektrum abzudecken, oder nur einen, der auf unterschiedliche Weise über die Komponenten spricht. Grundsätzlich können Sie möglicherweise erraten, wie viele begrenzte Kontexte Sie haben, indem Sie das Conway-Gesetz rückwärts anwenden.
Wenn Sie der Ansicht sind, dass begrenzte Kontexte mit Diensten ausgerichtet sind, ist dies möglicherweise einfacher: Sollten Sie in der Lage sein, diese beiden Funktionen unabhängig voneinander bereitzustellen? Ja schlägt zwei begrenzte Kontexte vor; aber wenn sie synchron gehalten werden müssen, dann ist es vielleicht nur eine.
quelle
In Ihrer Domain sollten Sie nicht wissen müssen, dass die Datenbank überhaupt existiert.
In Ihrer Domain geht es um Geschäftsregeln. Das Zeug, das überleben muss, wenn das Unternehmen, das Ihre Datenbank erstellt hat, sein Geschäft aufgibt. Das heißt, wenn Sie möchten, dass Ihr Unternehmen überlebt. Es ist wirklich schön, wenn es diesen Regeln egal ist, dass Sie die Art und Weise geändert haben, wie Sie Daten beibehalten.
Datenbankdetails sind vorhanden und müssen behandelt werden. Sie sollten woanders wohnen. Setzen Sie sie über eine Grenze. Kontrollieren Sie sorgfältig, wie Sie über diese Grenze hinweg kommunizieren oder ob es sich nicht um eine Grenze handelt.
Onkel Bob hat folgendes zu sagen, in was Sie Ihre Daten eintragen sollen:
Er erklärt auch, wie Ihre äußeren Schichten Plugins zu Ihren inneren Schichten sein sollten, damit innere Schichten nicht einmal wissen, dass äußere Schichten existieren.
Befolgen Sie so etwas und Sie haben einen guten Ort, um die Datenbank zu ignorieren, wo Sie sich Gedanken über Regeln zur Eingabevalidierung machen können, Regeln, die irgendwie beibehalten werden müssen, Regeln zum Ausführen von Berechnungen, Regeln zum Senden dieser Ergebnisse an eine beliebige Ausgabe. Es ist tatsächlich einfacher, diese Art von Code zu lesen.
Entweder das oder Sie entscheiden, dass Ihre Domain wirklich nur dazu dient, die Datenbank zu manipulieren. In diesem Fall ist Ihre Domänensprache SQL. Wenn dies in Ordnung ist, erwarten Sie jedoch nicht, dass Ihre Implementierung der Geschäftsregeln eine Änderung der Persistenz überlebt. Am Ende müssen Sie sie komplett neu schreiben.
quelle
Anwendung der DDD-Theorie:
In dieser Domäne gibt es zwei begrenzte Kontexte:
Jeder begrenzte Kontext kann ein anderes architektonisches Design haben.
Beispiel:
Das Kundeninvestitionskonto ist eine Entität (möglicherweise ein Aggregat, abhängig von der Domäne), und die Persistenz der Daten erfolgt über das Repository der Entität (RDB oder ein anderer DB-Typ wie eine OO-Datenbank).
Es gibt keinen DDD-Ansatz für CRUD-Operationen. Wenn ein DB-Feld an die Daten eines Objekts gebunden wird, werden die Entwurfsprinzipien verletzt.
quelle