Sto (ri) progettando un'applicazione su larga scala, usiamo l'architettura multi-layer basata su DDD.
Abbiamo MVC con livello dati (implementazione di repository), livello di dominio (definizione del modello di dominio e interfacce - repository, servizi, unità di lavoro), livello di servizio (implementazione di servizi). Finora, utilizziamo modelli di dominio (principalmente entità) su tutti i livelli e utilizziamo DTO solo come modelli di vista (nel controller, i modelli di dominio di restituzione del servizio e il controller creano il modello di vista, che viene passato alla vista).
Ho letto innumerevoli articoli sull'uso, non sull'uso, sulla mappatura e sul superamento dei DTO. Comprendo che non esiste una risposta definitiva, ma non sono sicuro che sia corretto o non restituisca i modelli di dominio dai servizi ai controller. Se restituisco il modello di dominio, non viene mai passato alla vista, poiché il controller crea sempre un modello di vista specifico per la vista - in questo caso, sembra legittimo. D'altra parte, non sembra giusto quando il modello di dominio lascia il livello aziendale (livello di servizio). A volte il servizio deve restituire un oggetto dati non definito nel dominio e quindi è necessario aggiungere un nuovo oggetto al dominio non mappato o creare un oggetto POCO (è brutto, poiché alcuni servizi restituiscono modelli di dominio, alcuni restituire effettivamente DTO).
La domanda è: se utilizziamo rigorosamente i modelli di visualizzazione, è possibile restituire i modelli di dominio ai controller o dovremmo sempre utilizzare DTO per la comunicazione con il livello di servizio? In tal caso, è corretto regolare i modelli di dominio in base ai servizi necessari? (Francamente non la penso così, dal momento che i servizi dovrebbero consumare quale dominio ha.) Se dovessimo attenerci rigorosamente ai DTO, dovrebbero essere definiti nel livello di servizio? (Penso di sì.) A volte è chiaro che dovremmo usare DTO (ad esempio, quando il servizio esegue molta logica aziendale e crea nuovi oggetti), a volte è chiaro che dovremmo usare solo modelli di dominio (ad esempio, quando il servizio di appartenenza restituisce un utente anemico ( s) - sembra che non avrebbe molto senso creare DTO uguale al modello di dominio - ma preferisco coerenza e buone pratiche.
Articolo Dominio vs DTO vs ViewModel - Come e quando usarli? (e anche alcuni altri articoli) è molto simile al mio problema, ma non risponde a questa / e domanda / e. Articolo Dovrei implementare DTO nel modello di archivio con EF? è anche simile, ma non si occupa di DDD.
Dichiarazione di non responsabilità: non intendo utilizzare alcun modello di progettazione solo perché esiste ed è elegante, d'altra parte, vorrei utilizzare buoni modelli e pratiche di progettazione anche perché aiuta a progettare l'applicazione nel suo insieme, aiuta con la separazione delle preoccupazioni, anche il fatto di usare un modello particolare non è "necessario", almeno al momento.
Come sempre, grazie.