it-swarm.com.de

Ist in DDD die Validierungsanwendungslogik oder die Domänenlogik?

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, dass Sie verheiratet sind. 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, wie z. B. Laravel, bieten Validierungsregeln, mit denen Eingaben validiert werden können, bevor eine Anforderung den Controller erreicht. Bricht es 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 Domänenschicht auf die Datenbank zugreifen, oder muss ich eine Nicht-SQL-Suche verwenden, um ein gültiges Land zu ermitteln?

  • Ist es notwendig, die Eingabe sowohl auf Anwendungs- als auch auf Domänenebene zu validieren?

26
Extrakun

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

Anwendung. Der gewünschte magische Suchbegriff lautet Anti-Korruptions-Ebene

In der Regel handelt es sich bei der von Ihrer Anwendung empfangenen Nachricht um eine DTO-Variante. Ihre Antikorruptionsschicht erstellt normalerweise Werttypen, die von der Domäne erkannt werden. Der tatsächliche Befehl, der an das Domänenmodell gesendet wird, wird als validierte 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 würde das DTO in einen Einzahlungswerttyp konvertieren, der einen validierten Betrag (der nicht negativ sein darf) und einen validierten CurrencyCode (der einer der unterstützten Codes in der Domäne sein muss) enthalten würde.

Nachdem der Befehl erfolgreich in Typen analysiert wurde, die das Domänenmodell versteht, wird der Befehl in der Domäne ausgeführt, wodurch der Befehl möglicherweise immer noch abgelehnt wird, weil er die Geschäftsinvariante verletzen würde (das Konto existiert noch nicht, das Konto ist gesperrt). Dieses spezielle Konto darf diese Währung nicht verwenden? etc).

Mit anderen Worten, die Geschäftsvalidierung wird im Domänenmodell stattfinden, nachdem die Antikorruptionsschicht die Eingaben validiert hat.

Die Implementierung der Validierungsregeln erfolgt normalerweise entweder im Konstruktor des Werttyps oder innerhalb der Factory-Methode, die zum Erstellen des Werttyps verwendet wird. Grundsätzlich beschränken Sie die Konstruktion der Objekte so, dass sie garantiert gültig sind, isolieren die Logik an einer Stelle und rufen sie an den Prozessgrenzen auf.

33
VoiceOfUnreason

Ihr Problemdomänenmodell enthält Ihre Geschäftsregeln für Domänen. Geschäftsregeln sind Einschränkungen für die Elemente des Modells. Sie bedeuten, dass sich ein Aufzug nicht bei geöffneter Tür bewegt, dass verderbliche Waren nicht in einen nicht gekühlten Container geladen werden und dass eine stornierte Bestellung nicht versendet wird.

Das bedeutet nicht, dass bei der Interaktion Ihrer Domain mit Menschen (über Bildschirme, Formulare usw.) keine Validierung oder Unterstützung erforderlich ist. Erkenne einfach, dass es optional ist.

Beachten Sie, dass es zwei Arten von Geschäftsregeln gibt: - Eigenschaftsregeln, die die Attribute eines Objekts einschränken, und Regeln für die Zusammenarbeit, 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 usw. sind.

Hinweis: In DDD gibt es kein Konzept zum "Modellieren" Ihres Formulars.

6
aryeh

Würde ein bestimmter Status die Modellentität ungültig machen? Wenn ja, muss das Modell verhindern, dass die Entität in diesen Zustand gelangt. Das heißt, das Modell muss 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 aufgenommen.

Zum Validierungskontext: Es besteht kein Problem, dass die Entität zusätzliche Daten abfragen kann. Aber es sollte egal sein, woher diese Daten kommen. Es ist egal, ob es aus SQL, File oder nur fest codiert ist. Deshalb gibt es Repositories. Die Domäne definiert, welche Art von Abfrage benötigt wird, und ermöglicht es einer anderen Person, sich um die Implementierung zu kümmern.

0
Euphoric