DDD: Come distinguere tra i servizi di applicazione e di dominio?

1

Sto esplorando il campione DDD Cargo.

C'è BookingService che appartiene al livello dell'applicazione. Ma guardando il codice, sembra che tutti i metodi corrispondano a Domain Logic (bookNewCargo, assignCargoToRoute, ecc.).

Perché è in Application Layer allora?

Qual è la differenza tra servizi di applicazioni e dominio?

Così confuso!

    
posta Teimuraz 17.08.2017 - 16:34
fonte

1 risposta

5

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.

  1. Ottieni un handle per una radice aggregata, con una copia locale di stato
  2. Invia un comando alla radice aggregata, permettendogli di aggiornare lo stato locale
  3. 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.

    
risposta data 17.08.2017 - 19:22
fonte

Leggi altre domande sui tag