Se per DDD Purist intendi qualcuno che segue il libro di Eric Evans alla lettera allora non va bene. Evans chiarisce che le classi che non sono radici aggregate non possono essere recuperate da nessun posto se non attraverso una radice aggregata. Da pagina 92:
Now, to translate that conceptual AGGREGATE into the implementation, we need a set of rules to apply to all transactions:
- The root ENTITY has global identity, and is ultimately responsible for checking invariants.
- Root ENTITIES have global identity. ENTITIES inside the boundary have local identity, unique only
within the AGGREGATE.
- Nothing outside the AGGREGATE boundary can hold a reference to anything inside, except to the root ENTITY. The root ENTITY can hand references to the internal ENTITIES to other objects, but those objects can only use them transiently, and may not hold onto the reference. The root may hand a copy of a value to another object, and it doesn’t matter what happens to it, since it’s just a value and no longer will have any association with the AGGREGATE.
- As a corollary to the above rule, only AGGREGATE roots can be obtained directly with database queries. All other objects must be found by traversal of associations.
- Objects within the AGGREGATE can hold references to other AGGREGATE roots.
- A delete operation must remove everything within the AGGREGATE boundary at once. (With garbage collection, this is easy. Since there are no outside references to anything but the root, delete the root and everything else will be collected.)
- When a change to any object within the AGGREGATE boundary is committed, all invariants of the whole AGGREGATE must be satisfied.
Stranamente, uno dei suoi prossimi esempi è di una classe simile a una fattura, e sottolinea che la Fattura è una radice aggregata nel suo esempio. Se ti stai riscontrando questo problema, forse è un segno che anche una Fattura è una radice aggregata nel tuo sistema.
Non solo, ma la tua domanda in particolare sembra essere specifica sul fatto che il livello del servizio applicativo possa creare o meno un oggetto dominio . Penso che la risposta sia abbastanza chiara. No. Evans ha una sezione del libro dedicata al ciclo di vita degli oggetti di dominio ed è abbastanza chiaro che le Fabbriche hanno questa responsabilità. Inoltre, vorrei indirizzare la tua attenzione a pagina 76 e alla sezione intitolata SERVIZI e il livello di dominio isolato in cui fornisce la seguente tabella:
Partitioning Services into Layers
Application
Funds Transfer App Service:
- Digests input (e.g. XML request)
- Sends message to domain service for fulfillment
- listens for confirmation
- decides to send notification using infrastructure service.
Domain
Funds Transfer Domain Service:
Interacts with necessary Account and Ledger objects, making appropriate debits and credits, supplies confirmation of result (transfer allowed or not, etc.)
Infrastructure
Send Notification Service:
Sends emails, letters, etc. as directed by application.
Sulla base di questa comprensione dei Servizi, penso che un purista del DDD si possa ritorcere contro l'idea di un oggetto Fattura creato all'interno di un Servizio Applicazione. Naturalmente, tutto questo presuppone che l'uso del termine "Application Service" corrisponda all'utilizzo di Evans. Ma penso che la risposta di Evans sia abbastanza chiara.