Handelt es sich bei DDD um Validierungsanwendungslogik oder Domänenlogik?

26

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?

Extrakun
quelle
6
Ihre Frage geht davon aus, dass es immer einen richtigen Ort gibt, an dem alles abgelegt werden kann. Gibt es nicht
Robert Harvey
1
Was @RobertHarvey sagt. Die Validierung sollte immer auf dem Modell erfolgen, unabhängig von der Validierung durch die "Anwendung" (ist das Modell nicht Teil der Anwendung?). Eine Validierung in der "Anwendung" sollte nur eine Wiederholung der Validierung des Modells sein, um die Reaktionsfähigkeit der Benutzeroberfläche zu verbessern, oder sie sollte nur mit der Logik "Anwendung" zusammenhängen (wie in: "in diesem Formular können Sie nur eingeben. .. ", aber ich habe eine Entitätsvalidierung angenommen). Vertrauen Sie niemals der "Anwendungs" -Schicht für die Domain-Validierung. Es kann sein, dass nicht Ihr Kunde die Informationen sendet ...
Marjan Venema

Antworten:

29

Befindet sich diese Art der Validierung in der Domänen- oder Anwendungsschicht?

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.

VoiceOfUnreason
quelle
Warum ist Bewerbung die Antwort? Entsprechend Ihrem Text kann die formale Validierung sowohl in der Domäne oder in der Anwendung als auch die Geschäftsvalidierung nur in der Domäne erfolgen.
Inf3rno
@ inf3rno, weil die Fragen speziell zur Validierung eines Formulars gestellt wurden, das nicht mit der Domain zusammenhängt
Flugplan vom
1
Diese Antwort macht keinen Sinn. DDDs Anti-Corruption Layer ist zusätzlicher Code, den Sie schreiben, um in ein externes (eines anderen Systems) Domänenmodell und in das Domänenmodell Ihrer DDD-basierten Anwendung zu übersetzen. Wenn es kein solches externes System gibt, gibt es keine Antikorruptionsschicht. Darüber hinaus gehört die Überprüfung von Geschäftsregeln zum Domänenmodell (und zur Domänenschicht) und nicht zur Anwendungsschicht. Bei DTOs handelt es sich um eine technische Komponente (in der Anwendungsebene), die in einer DDD-App vorhanden sein kann oder nicht. Das Konvertieren zwischen DTOs und Entities / ValueObjects hat nichts mit Anti-Corruption-Layern zu tun.
Rogério
5

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.

Aryeh
quelle
0

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.

Euphorisch
quelle
-2

Die Domänenschicht sollte die gesamte Validierungslogik enthalten. Präsentations-, Anti-Korruptions-Schichten oder andere abhängige Schichten sollten dies widerspiegeln.

Barry Faassen
quelle