Nach meinem Verständnis besteht ein Hauptpunkt darin, die Domänenlogik (Geschäftslogik) von der Infrastruktur (Datenbank, Dateisystem usw.) zu trennen.
Dies ist die Grundlage des Missverständnisses: Der Zweck von DDD besteht nicht darin, Dinge entlang einer festen Linie zu trennen, wie "dies ist im SQL-Server, darf also nicht BL sein". Der Zweck von DDD besteht darin, Domänen zu trennen und Barrieren zwischen ihnen zu schaffen diese, mit denen die Interna einer Domain vollständig von den Interna einer anderen Domain getrennt werden können, und die gemeinsam genutzten Externa zwischen ihnen definieren können.
Stellen Sie sich SQL nicht als BL / DL-Barriere vor - das ist es nicht. Stellen Sie sich stattdessen "dies ist das Ende der internen Domäne" als Barriere vor.
Jede Domäne sollte über nach außen gerichtete APIs verfügen, mit denen sie mit allen anderen Domänen zusammenarbeiten kann. Im Fall der Datenspeicherschicht sollte sie über Lese- / Schreibaktionen (CRUD) für die gespeicherten Datenobjekte verfügen. Diese Mittel SQL selbst nicht wirklich die Barriere ist, die VIEW
und PROCEDURE
sind Komponenten. Sie sollten niemals direkt aus der Tabelle lesen: Dies ist das Implementierungsdetail , um das sich DDD als externer Verbraucher keine Sorgen machen sollte.
Betrachten Sie Ihr Beispiel:
Ich frage mich, was passiert, wenn ich sehr komplexe Abfragen habe, wie z. B. eine Abfrage zur Berechnung von Materialressourcen? Bei solchen Abfragen arbeiten Sie mit umfangreichen Operationen, für die SQL entwickelt wurde.
Genau das sollte in SQL dann sein, und es ist keine Verletzung von DDD. Dafür haben wir DDD gemacht . Mit dieser Berechnung in SQL wird dies Teil des BL / DL. Was auf Sie tun würde , eine separate Ansicht / Stored Procedure verwenden / was-haben-Sie und halten Sie die Geschäftslogik von der Datenschicht getrennt sind , als dass Ihre externe API ist. Tatsächlich sollte Ihre Datenschicht eine andere DDD-Domänenschicht sein, auf der Ihre Datenschicht eigene Abstraktionen für die Arbeit mit den anderen Domänenschichten hat.
Das Durchführen dieser Berechnungen in der Infrastruktur ist nicht möglich, da das DDD-Muster Änderungen in der Infrastruktur zulässt, ohne die Domänenebene zu ändern, und zu wissen, dass MongoDB nicht über die gleichen Funktionen wie z. B. SQL Server verfügt, die nicht möglich sind.
Das ist ein weiteres Missverständnis: Es besagt, dass sich Implementierungsdetails intern ändern können, ohne dass andere Domänenschichten geändert werden . Es heißt nicht, dass Sie nur eine ganze Infrastruktureinheit ersetzen können .
Denken Sie auch hier daran, dass es bei DDD darum geht, Interna mit genau definierten externen APIs zu verbergen. Wo diese APIs sitzen, ist eine ganz andere Frage, und DDD definiert das nicht. Es definiert lediglich, dass diese APIs existieren und sich niemals ändern sollten .
DDD ist nicht so eingerichtet, dass Sie MSSQL ad-hoc durch MongoDB ersetzen können - das sind zwei völlig unterschiedliche Infrastrukturkomponenten.
Verwenden wir stattdessen eine Analogie für das, was DDD definiert: Gas vs. Elektroautos. Beide Fahrzeuge verfügen über zwei völlig unterschiedliche Methoden zum Erzeugen von Antrieben, aber dieselben APIs: Ein / Aus, Gas / Bremse und Räder zum Antreiben des Fahrzeugs. Laut DDD sollten wir in der Lage sein, den Motor (Gas oder Elektrizität) in unserem Auto auszutauschen. Es heißt nicht, dass wir das Auto durch ein Motorrad ersetzen können, und genau das ist MSSQL → MongoDB.