ADM è un buon modello per una soluzione di servizi distribuiti come microservizi. Si adatta a molti dei casi aziendali di oggi basati sul web.
Considera se abbiamo un oggetto Dominio ordine. Con un approccio OOP aggiungeremmo Order.Purchase () Order.Cancel () ecc. Funzionerebbe bene in un'app desktop, dove conserviamo gli ordini in memoria e facciamo più cose nella stessa istanza.
Ma se abbiamo un sistema distribuito, con programmi che riguardano solo una cosa, ovvero accedere a un elenco di ordini e acquistarli a turno, oppure ottenere un elenco di ordini e cancellarli a turno, avere entrambi i metodi sullo stesso oggetto non fa senso. Dovremmo avere due domini o contesti limitati:
PurchaseSystemOrder.Purchase()
e
CancelSystemOrder.Cancel();
L'unica cosa che questi oggetti condividono sarebbe la struttura dei dati delle proprietà.
Man mano che aggiungi sempre più microservizi, finisci con dozzine di tipi di ordine. Non ha più senso parlare di un Ordine come oggetto Dominio, anche se è lo stesso ordine concettuale che viene elaborato da tutti questi sistemi.
Ha molto più senso avere un modello Anemic, Order, che incapsula solo i dati e rinominare i servizi di conseguenza:
PurchaseService.Purchase(Order order)
Ora possiamo parlare di nuovo di Order e possiamo aggiungere qualsiasi nuovo servizio che pensiamo di elaborare, senza influire sugli altri servizi attualmente distribuiti.
Fowler e Co provengono da un background di sistema monolitico, nel loro mondo un approccio ADM significherebbe un'unica app con tutti questi servizi separati istanziati in memoria e OrderDTO viene fatto circolare e mutato. Questo sarebbe molto peggio che mettere i metodi su un ricco modello di Ordine.
Ma in un sistema distribuito, ci sono molti programmi, ognuno richiede solo un singolo metodo Ordine e lo esegue su più ordini, caricandoli ciascuno, eseguendo il metodo e quindi scartandolo. Richiede solo un singolo servizio e un flusso di oggetti dati.
Il popolamento completo di un modello completo, preoccuparsi dei requisiti e delle dipendenze di tutti i metodi solo per chiamarne uno singolo e scartare l'oggetto quasi immediatamente è inutile.
Inoltre, una modifica a uno dei metodi richiederebbe l'aggiornamento di tutti i componenti distribuiti poiché dipendono tutti dal modello Rich per la loro logica.
Non ho spazio nella mia base di codice per le cose di cui non hanno bisogno