In DDD, un servizio di dominio è essenzialmente solo un modello di facciata e / o mediatore?


13

In Domain Driven Design, il livello di dominio può avere diversi servizi (tradizionali). Ad esempio, per il dominio Utente, potremmo avere:

  • Una UserFactory, che crea oggetti utente in diversi modi
  • Un archivio utenti, che è responsabile dell'interazione con i servizi di persistenza nel livello dell'infrastruttura

Un UserService nel livello di dominio è semplicemente un mediatore e / o una facciata per quei due servizi e il livello di infrastruttura o c'è altro?



Ho letto molto i post di Level Gorodinski, ma non ho mai visto quel secondo link. Ottima lettura, tocca sicuramente alcuni punti importanti!
e_i_pi il

Risposte:


11

Domain services sono meglio descritti da ciò che non sono:

  • non sono né EntitiesAggregate roots
  • non sono Value objects
  • portare conoscenza del dominio che non si adatta naturalmente solo a uno Entity o uno Value object

Un esempio di a Domain serviceè a Saga/Process manager: coordina un lungo processo che coinvolge molteplici Aggregate roots, possibili da diversi Bounded contexts.

Detto questo, ciò che è a Domain servicee come viene implementato sono due cose ortogonali.

Un UserService nel livello di dominio è semplicemente un mediatore e / o una facciata per quei due servizi e il livello di infrastruttura o c'è altro?

Alcuni servizi di dominio come UserRepository(composto da un'interfaccia definita in Domain layere un'implementazione concreta in Infrastructure layer) possono essere implementati usando il Facademodello di progettazione. Altri servizi di dominio non lo sono.

Non esiste una regola rigida su come implementarli, a parte l'importante regola che Domain layernon deve dipendere da altri livelli (e SOLID ).


Grazie, penso di aver finalmente capito il Domain Layer. Oltre a contenere gli oggetti dati (aggregati, entità e oggetti valore) contiene anche le regole di business, ma non l'implementazione concreta di tali regole. I servizi di dominio definiscono cosa è possibile fare per gli oggetti dati di dominio, ma non sono a conoscenza del funzionamento interno di tali operazioni.
e_i_pi il

1
Le regole aziendali di @e_i_pi sono protette solo dagli aggregati e dalle loro entità nidificate. I servizi di dominio non sono coinvolti in questo.
Constantin Galbenu,

1
@e_i_pi dove l'operazione coinvolge più di un aggregato. Ad esempio, dato l'elenco di conti bancari (aggregati) di una persona (un altro aggregato), un servizio di dominio calcolerebbe il saldo totale di tali conti.
Constantin Galbenu,

1
@e_i_pi: penso che tu abbia alcune idee sbagliate. Pertanto, l'intero livello di dominio è un modello software del tuo dominio. Hai detto - "Oltre a contenere gli oggetti dati (aggregati, entità e oggetti valore)" - questi non sono "oggetti dati", nel senso che contengono solo dati; questi in realtà implementano regole di dominio, definiscono il comportamento. Ora, i servizi di dominio , secondo il DDD Book di E. Evans , sono quegli aspetti del dominio che non si adattano naturalmente a un oggetto (un'entità o un oggetto valore).
Filip Milovanović,

1
Piuttosto, un servizio di dominio "è definito semplicemente in termini di cosa può fare per un client", definito in termini di altri elementi del modello di dominio (quindi orchestra in qualche modo quegli elementi e applica regole di dominio che regolano tale orchestrazione). Il servizio di dominio stesso è senza stato. Esiste anche il concetto di Application Services , che risiede in un livello di livello superiore e essenzialmente implementa user story o utilizza equivalentemente casi, fungendo da interfaccia verso il livello di dominio. Si noti che il rapporto tra oggetti e servizi varierà in base al dominio modellato.
Filip Milovanović,

1

Vedo i servizi in DDD come risultato dell'inversione delle dipendenze .

Se dovessi usare dipendenze "semplici", il tuo codice di dominio chiamerebbe il database per salvare o interrogare un'entità, o factory, che crea un'entità, che è legata al database o al servizio esterno o ad un altro tipo di codice di infrastruttura.

Ma non è così che dovrebbe essere il codice di dominio. Il codice del dominio non dovrebbe dipendere dal codice dell'infrastruttura. Poiché questa dipendenza rende più difficile il test e, possibilmente, il riutilizzo. Ecco perché inverti quella dipendenza. Il codice dell'infrastruttura dipende dal codice del dominio. E per farlo, devi introdurre un'astrazione. Un'astrazione che definisce quale comportamento il codice di dominio prevede di essere implementato dall'infrastruttura.

E i servizi in DDD sono quell'astrazione. Nella maggior parte dei casi, per il codice di dominio, tali servizi dovrebbero essere semplici interfacce. E l'implementazione dovrebbe essere nel codice dell'infrastruttura, che ha dipendenza da quelle interfacce.


Grazie per la tua risposta, entrambe le risposte insieme mi hanno dato il "aha!" momento. Penso che senza la tua risposta non avrei compreso appieno il concetto, ma preferisco la risposta di Costantino come indicatore per i futuri lettori.
e_i_pi il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.