Probabilmente domande simili sono state poste molte volte, ma penso che ogni risposta aiuti a rendere la comprensione della DDD sempre migliore. Vorrei descrivere come percepisco certi aspetti del DDD. Ho alcune incertezze di base intorno ad esso e apprezzerei se qualcuno potesse dare una solida e pratica ansiosa. Si prega di notare che queste domande assumono un approccio "classico" alla DDD. Ciò significa utilizzare gli ORM, ecc. Approcci come CQRS e sourcing di eventi non sono considerati qui.Potete suggerire le best practice DDD
Aggregati e entità sono gli oggetti principali che implementano la logica di dominio. Hanno uno stato e un'identità. In questo contesto, percepisco la logica del dominio come l'insieme di tutti i comandi che mutano quello stato. Ha senso? Perché la logica del dominio riguarda esclusivamente lo stato? È legale modellare oggetti di dominio che non hanno identità o stato? Perché un oggetto dominio non può essere implementato come uno script di transazione? Esempio: considera un oggetto che ti consiglia un partner per un sito di appuntamenti. Quell'oggetto non ha uno stato reale, ma ha un bel po 'di logica di dominio? Inserirlo nel livello di servizio implica che il modello di dominio non possa coprire tutta la logica.
Accesso ad altri oggetti del dominio. Gli aggregati possono accedere a un repository? Esempio: quando un oggetto dominio (stato) deve avere accesso a tutti gli "utenti" del sistema per eseguire il proprio lavoro, è necessario accedervi tramite il repository. Di conseguenza, un ORM dovrebbe iniettare il repository durante il caricamento dell'oggetto (che potrebbe essere tecnicamente più impegnativo). Se gli oggetti non possono avere accesso ai repository, dove inseriresti la logica del dominio per questo esempio? Nel livello di servizio? Il livello di servizio non dovrebbe avere nessuna logica?
Gli aggregati e le entità non dovrebbero parlare con il mondo esterno, sono solo preoccupati del loro contesto limitato. Non dovremmo iniettare dipendenze esterne (come IPaymentGateway o IEmailService) in un oggetto di dominio, questo farebbe sì che il dominio gestisca le eccezioni che provengono dall'esterno. Soluzione: un approccio basato sugli eventi. Come spedisci gli eventi allora? Devi comunque iniettare gli "ascoltatori" corretti ogni volta che istanzia un oggetto dominio. Gli ORM riguardano il ripristino dei "dati", ma non sono intesi principalmente a iniettare dipendenze. Abbiamo bisogno di un mix DI-ORM?
Oggetti dominio e DTO. Quando si interroga una radice aggregata per il suo stato, viene restituita una proiezione del suo stato (DTO) o degli oggetti del dominio stessi? Nella maggior parte dei modelli che vedo, i clienti hanno pieno accesso al modello di dati del dominio, introducendo un profondo accoppiamento con la struttura effettiva del dominio. Percepisco il "grafico dell'oggetto" dietro un aggregato come sua attività. Questo è incapsulamento, giusto? Quindi per me una radice aggregata dovrebbe restituire solo DTO. I DTO sono spesso definiti nel livello di servizio, ma il mio approccio è quello di modellarlo nel dominio stesso. Il livello di servizio potrebbe ancora aggiungere un altro livello di astrazione, ma questa è una scelta diversa. E 'un buon consiglio?
I repository gestiscono tutte le operazioni CRUD al livello radice aggregato. Che dire di altre domande? Le query restituiscono gli oggetti DTO e non i domini. Affinché funzioni, il dipendente deve essere consapevole della struttura dati del dominio che introduce un accoppiamento. Il mio consiglio è simile a prima: usa gli eventi per popolare le visualizzazioni. Pertanto, la struttura interna non è resa pubblica, solo gli eventi portano i dati necessari per costruire la vista.
Unità di lavoro. Un controller al limite del sistema istanzia i comandi e li passa a un livello di servizio che a sua volta carica gli aggregati appropriati e inoltra i comandi. Il controller potrebbe utilizzare più comandi e passarli a più servizi. Tutto ciò è controllato dall'unità di modello di lavoro. Ciò significa, repository, entità, servizi: tutti partecipano alla stessa transazione. Sei d'accordo?
La logica di Buisness non è la logica del dominio.Da un punto di vista commerciale la realizzazione di un caso d'uso può comportare diversi passaggi: registrazione di un cliente, invio di un messaggio di posta elettronica, creazione di un account di archiviazione, ecc. Questo processo complessivo può essere impossibile in una radice aggregata del dominio. L'oggetto dominio dovrebbe avere accesso a tutti i tipi di infrastrutture. Soluzione: flussi di lavoro o saghe (o script di transazione). E 'un buon consiglio?
Grazie
Alcuni buoni punti/domande vengono riportati qui, ma SO non è un forum di discussione. Ci sono troppe domande e non ci sono risposte chiare. – EkoostikMartin
A giudicare dalle vostre domande, sembra che non siete riusciti a ottenere lo spirito di DDD su alcuni punti (servizi di dominio vs servizi applicativi, come i livelli giocano insieme, ecc.). Altri hanno già avuto risposta molte volte qui su SO.Suggerisco di rileggere i capitoli pertinenti nel libro, cercando qui le risposte e tornando indietro con domande separate per problemi con i quali si hanno ancora problemi. – guillaume31