Mi sto immergendo in Domain Driven Design e alcuni dei concetti che sto incontrando hanno molto senso in superficie, ma quando ci penso di più mi chiedo se sia davvero una buona idea.
Il concetto di Aggregati, ad esempio, ha senso. Crei piccoli domini di proprietà in modo da non dover gestire l'intero modello di dominio.
Tuttavia, quando penso a questo nel contesto di un'applicazione web, stiamo frequentemente colpendo il database per recuperare piccoli sottoinsiemi di dati. Ad esempio, una pagina può solo elencare il numero di ordini, con i collegamenti per fare clic su per aprire l'ordine e vedere i suoi ID ordine.
Se ho capito bene gli Aggregati, normalmente userei il modello di repository per restituire un OrderAggregate che conterrebbe i membri GetAll
, GetByID
, Delete
e Save
. Ok suona bene. Ma ...
Se chiamo GetAll per elencare tutti i miei ordini, mi sembra che questo modello richiederebbe l'intero elenco di informazioni aggregate da restituire, completare ordini, righe d'ordine, ecc ... Quando ho solo bisogno di un piccolo sottoinsieme di tali informazioni (solo informazioni di intestazione).
Mi manca qualcosa? O c'è qualche livello di ottimizzazione che useresti qui? Non posso immaginare che qualcuno sosterrebbe il ritorno di interi aggregati di informazioni quando non ne hai bisogno.
Certamente, si potrebbero creare metodi sul repository come GetOrderHeaders
, ma ciò sembra vanificare lo scopo di utilizzare un repository come il pattern in primo luogo.
Qualcuno può chiarirlo per me?
Modifica
Dopo molte più ricerche, penso che la disconnessione qui sia che un modello di Repository puro è diverso da quello che la maggior parte delle persone pensa di un Repository.
Fowler definisce un repository come un archivio dati che utilizza la semantica della raccolta e viene generalmente conservato in memoria. Ciò significa creare un intero grafo degli oggetti.
Evans modifica il repository per includere i root aggregati e quindi il repository viene amputato per supportare solo gli oggetti in un aggregato.
La maggior parte delle persone sembra pensare ai repository come agli oggetti di accesso ai dati glorificati, dove basta creare metodi per ottenere qualsiasi dato desiderato. Questo non sembra essere l'intento descritto nei modelli di Fowler's Enterprise Architecture.
Altri ancora pensano a un repository come a una semplice astrazione utilizzata principalmente per rendere più facile la verifica e la simulazione, o per dissociare la persistenza dal resto del sistema.
Credo che la risposta sia che questo è un concetto molto più complesso di quanto pensassi all'inizio.