Why is it in Application Layer then?
Per quanto posso dire, perché si tratta di un servizio applicativo, in particolare perché il consumatore di questo servizio è l'applicazione, non il dominio.
Ad esempio, dai un'occhiata a BookingService.assignCargoToRoute , se eliminiamo la gestione delle registrazioni e delle eccezioni, vediamo
public void assignCargoToRoute(final Itinerary itinerary, final TrackingId trackingId) {
final Cargo cargo = cargoRepository.find(trackingId);
cargo.assignToRoute(itinerary);
cargoRepository.store(cargo);
}
È uno schema classico per un'applicazione che interagisce con il dominio.
- Ottieni un handle per una radice aggregata, con una copia locale di stato
- Invia un comando alla radice aggregata, permettendogli di aggiornare lo stato locale
- Configura la modifica dello stato locale nel repository condiviso, in modo che le modifiche siano visibili al di fuori di questo thread specifico.
BookingService .bookNewCargo è simile; ma confuso dal fatto che (a) i modelli di creazione sono bizzarri e (b) questo particolare design è un po 'anemico; il modello di dominio, in particolare la radice di aggregazione Cargo, dovrebbe fare più del lavoro.
Se lavori attraverso il grafico delle chiamate, noterai che
Quindi il consumatore del BookingService è l'applicazione (indirettamente, CargoAdminController); questa cosa non è affatto un servizio di dominio. Il modello di dominio non sa mai che esiste.
Questa non è una grande discussione da sola. Un altro accenno al fatto che abbiamo a che fare con un servizio di applicazione è che l'implementazione conosce Repository
, che non è un concetto di dominio. Dato che i servizi di dominio sono talvolta utilizzati per colmare una lacuna tra il resto del modello di dominio e alcune applicazioni o servizi di infrastruttura, possiamo concludere che l'euristica non è particolarmente buona neanche.
How to distinguish between application and domain services?
Il mio consiglio: non lasciarti coinvolgere dalle etichette. Presta attenzione alla coesione. Prestare attenzione a ciò che gli altri componenti cambiano quando si modifica il servizio. Guarda il tuo grafico delle dipendenze come un falco: se trovi che i tuoi servizi "di dominio" si inquinano con le dipendenze delle applicazioni, è un suggerimento che non hai ancora completamente allineato la separazione delle preoccupazioni.