ADM ist ein gutes Muster für eine Lösung verteilter Dienste wie Microservices. Es passt zu vielen der heutigen webbasierten Geschäftsfälle.
Überlegen Sie, ob wir ein Order Domain-Objekt haben. Mit einem OOP-Ansatz würden wir Order.Purchase () Order.Cancel () usw. hinzufügen. Dies würde gut in einer Desktop-App funktionieren, in der wir Bestellungen im Speicher halten und mehrere Dinge mit derselben Instanz ausführen.
Aber wenn wir ein verteiltes System mit Programmen haben, die nur zu einer Sache gehören, dh auf eine Liste von Bestellungen zugreifen und jede nacheinander kaufen, oder eine Liste von Bestellungen abrufen und jede nacheinander stornieren, dann macht es nein, wenn beide Methoden auf demselben Objekt liegen Sinn. Wir müssten zwei Domänen oder begrenzte Kontexte haben:
PurchaseSystemOrder.Purchase()
und
CancelSystemOrder.Cancel();
Das einzige, was diese Objekte gemeinsam haben würden, wäre die Datenstruktur der Eigenschaften.
Wenn Sie mehr und mehr Microservices hinzufügen, erhalten Sie Dutzende von Auftragstypen. Es ist nicht mehr sinnvoll, von einer Bestellung als Domänenobjekt zu sprechen , obwohl es sich um dieselbe konzeptionelle Reihenfolge handelt, die von all diesen Systemen verarbeitet wird.
Es ist weitaus sinnvoller, ein anämisches Modell, Order, zu haben, das nur die Daten kapselt und Ihre Dienste entsprechend umbenennt:
PurchaseService.Purchase(Order order)
Jetzt können wir wieder über die Bestellung sprechen und alle neuen Services hinzufügen, die wir uns für die Verarbeitung vorstellen, ohne die anderen derzeit bereitgestellten Services zu beeinträchtigen.
Fowler und Co haben einen monolithischen Systemhintergrund. In ihrer Welt würde ein ADM-Ansatz bedeuten, dass eine einzige App mit all diesen separaten Diensten im Speicher instanziiert wird und das OrderDTO weitergegeben und mutiert wird. Dies wäre weitaus schlimmer, als die Methoden auf ein reichhaltiges Ordnungsmodell zu übertragen.
In einem verteilten System gibt es jedoch viele Programme, für die jeweils nur eine Bestellmethode erforderlich ist und die bei mehreren Aufträgen ausgeführt wird. Dabei wird jeder geladen, die Methode ausgeführt und anschließend verworfen. Es ist nur ein einziger Dienst und ein Datenstrom erforderlich.
Es ist sinnlos, ein umfangreiches Modell vollständig zu füllen und sich über die Anforderungen und Abhängigkeiten aller Methoden Gedanken zu machen, um nur ein einziges aufzurufen und das Objekt dann fast sofort zu verwerfen.
Außerdem würde eine Änderung an einer einzelnen der Methoden die Aktualisierung aller verteilten Komponenten erfordern, da deren Logik alle vom Rich-Modell abhängt.
Ich habe in meinen Codebasen keinen Platz für Dinge, die sie nicht benötigen