Angenommen, wir modellieren ein Formular mit DDD. Mit dem Formular können bestimmte Geschäftsregeln verknüpft sein - möglicherweise müssen Sie ein Einkommen angeben, wenn Sie kein Student sind, und Sie müssen Ihre Kinder auflisten, wenn Sie angeben, verheiratet zu sein. Und wenn Sie ein Land angegeben haben, sollte es ein gültiges Land haben.
Befindet sich diese Art der Validierung in der Domänen- oder Anwendungsschicht? Einige andere Probleme, über die ich nachgedacht habe:
Bestimmte Frameworks, z. B. Laravel, bieten Validierungsregeln, mit denen Eingaben validiert werden können, bevor eine Anforderung den Controller erreicht. Bricht DDD, wenn die Validierung auf dieser Ebene erfolgt?
In Fällen wie der Feststellung, ob das Land gültig ist, frage ich normalerweise nur eine Datenbanktabelle aller Länder der Welt ab. In DDD wird dies jedoch (nach meinem Verständnis) wahrscheinlich auf der Domänenebene durchgeführt. Darf die Domain-Schicht auf die Datenbank zugreifen oder muss ich eine Nicht-SQL-Suche verwenden, um ein gültiges Land zu bestimmen?
Muss die Eingabe sowohl auf Anwendungs- als auch auf Domänenebene überprüft werden?
quelle
Antworten:
Anwendung. Der von Ihnen gewünschte magische Suchbegriff lautet Anti-Korruptions-Ebene
In der Regel handelt es sich bei der von Ihrer Anwendung empfangenen Nachricht um eine DTO-Nachricht. Ihre Antikorruptionsschicht erstellt normalerweise Werttypen, die von der Domäne erkannt werden. Der tatsächliche Befehl, der an das Domänenmodell gesendet wird, wird in validierten Werttypen ausgedrückt.
Beispiel: Ein DepositMoney-Befehl würde wahrscheinlich einen Betrag und einen Währungstyp enthalten. Die DTO-Darstellung würde wahrscheinlich den Betrag als Ganzzahl und den Währungscode als Zeichenfolge ausdrücken. Die Antikorruptionsschicht konvertiert das DTO in einen Einzahlungswerttyp, der einen validierten Betrag (der nicht negativ sein darf) und einen validierten Währungscode (der einer der unterstützten Codes in der Domäne sein muss) enthält.
Nachdem der Befehl erfolgreich in Typen analysiert wurde, die das Domänenmodell versteht, wird der Befehl in der Domäne ausgeführt, die den Befehl möglicherweise immer noch ablehnt, da dies die Geschäftsinvariante verletzen würde (das Konto ist noch nicht vorhanden, das Konto ist gesperrt). Dieses spezielle Konto darf diese Währung nicht benutzen? etc).
Mit anderen Worten, die Geschäftsüberprüfung wird im Domänenmodell durchgeführt, nachdem die Antikorruptionsschicht die Eingaben überprüft hat.
Die Implementierung der Validierungsregeln erfolgt normalerweise entweder im Konstruktor des Wertetyps oder in der Factory-Methode, die zum Erstellen des Wertetyps verwendet wird. Grundsätzlich schränken Sie die Konstruktion der Objekte so ein, dass ihre Gültigkeit garantiert ist, isolieren die Logik an einer Stelle und rufen sie an den Prozessgrenzen auf.
quelle
Ihr Problemdomänenmodell enthält die Geschäftsregeln Ihrer Domäne. Geschäftsregeln sind Einschränkungen für die Elemente des Modells. Sie bedeuten, dass sich ein Aufzug bei geöffneter Tür nicht bewegt, dass verderbliche Waren nicht in einen nicht gekühlten Container geladen werden und dass eine stornierte Bestellung nicht versendet wird.
Dies bedeutet nicht, dass bei der Interaktion Ihrer Domain mit Menschen (über Bildschirme, Formulare usw.) keine Validierung oder Unterstützung erforderlich ist. Erkenne nur, dass es optional ist.
Beachten Sie, dass es zwei Arten von Geschäftsregeln gibt: - Eigenschaftsregeln, die die Attribute eines Objekts einschränken, und Kollaborationsregeln, die das Hinzufügen und Entfernen von Kollaborationen zwischen Objekten einschränken.
Geschäftsregeln unterscheiden sich von Logikregeln, die sich auf Ihre Programmiersprache beziehen und prüfen, ob Werte angegeben wurden und nicht Null sind.
Hinweis: In DDD gibt es kein Konzept zum "Modellieren" Ihres Formulars.
quelle
Würde ein bestimmter Zustand die Modellentität ungültig machen? Wenn ja, muss das Modell verhindern, dass die Entität in diesen Zustand gelangt. Das Modell muss also wissen, wie es sich selbst validieren kann.
Es gibt jedoch ein kleines Problem: Die Modellvalidierung erfolgt häufig zu spät. Oft möchten wir die Validierung frühzeitig durchführen, damit der Benutzer nicht zu lange warten muss. Aus diesem Grund wird die Validierung häufig in die Anwendungslogik einbezogen.
Zum Kontext der Validierung: Es besteht kein Problem, dass eine Entität zusätzliche Daten abfragen kann. Es sollte aber egal sein, woher diese Daten kommen. Es ist egal, ob es aus SQL oder File stammt oder nur fest codiert ist. Deshalb gibt es Repositories. Die Domäne definiert, welche Art von Abfrage benötigt wird, und ermöglicht es anderen Personen, sich um die Implementierung zu kümmern.
quelle
Die Domänenschicht sollte die gesamte Validierungslogik enthalten. Präsentations-, Anti-Korruptions-Schichten oder andere abhängige Schichten sollten dies widerspiegeln.
quelle