ADM è un buon modello per una soluzione di servizi distribuiti come un microservizio. Si adatta a molti degli attuali casi aziendali basati sul Web.
Considera se abbiamo un oggetto Domain Order. Con un approccio OOP, aggiungeremo Order.Purchase () Order.Cancel (), ecc. Funzionerebbe bene in un'applicazione desktop, dove conserviamo gli ordini in memoria e facciamo più cose nella stessa istanza.
Ma se abbiamo un sistema distribuito, con programmi che includono solo una cosa, cioè accedere a un elenco di ordini e acquistarne uno a turno, o ottenere un elenco di ordini e annullare ciascuno a turno, avendo entrambi i metodi sullo stesso l'oggetto non ha senso Dovremmo avere due domini o contesti limitati:
PurchaseSystemOrder.Purchase()
e
CancelSystemOrder.Cancel();
L'unica cosa che condividono questi oggetti sarebbe la struttura dei dati delle proprietà.
Man mano che aggiungi sempre più microservizi, ottieni decine di tipi di ordine. Non ha più senso parlare di an come oggetto Dominio, anche se è lo stesso ordine concettuale che viene elaborato da tutti questi sistemi.
È molto più sensato avere un modello anemico, Ordine, che incapsula solo i dati e rinominare i servizi di conseguenza:
PurchaseService.Purchase(Order order)
Ora possiamo parlare di nuovo dell'Ordine e possiamo aggiungere qualsiasi nuovo servizio che pensiamo di elaborare, senza influire sugli altri servizi attualmente implementati.
Fowler e Co provengono da un background di sistema monolito, nel loro mondo un approccio ADM significherebbe una singola app con tutti questi servizi separati istanziati in memoria e OrderDTO che viene passato in giro e mutato. Questo sarebbe molto peggio di mettere i metodi su un ricco modello di ordine.
Ma in un sistema distribuito, ci sono molti programmi, ognuno richiede solo un singolo metodo Order e lo esegue su più ordini, caricandoli ciascuno, eseguendo il metodo e poi scartandolo. Richiede solo un singolo servizio e un flusso di oggetti di dati.
Compilare completamente un modello ricco, preoccuparsi dei requisiti e delle dipendenze di tutti i metodi solo per chiamarne uno singolo e poi scartare l'oggetto quasi immediatamente è inutile.
Inoltre, una modifica a uno solo dei metodi richiederebbe l'aggiornamento di tutti i componenti distribuiti poiché dipendono tutti dal modello avanzato per la loro logica.
Non ho spazio nella mia base di codice (s) per cose di cui non hanno bisogno