Ho bisogno di aiuto per trovare la mia radice e il limite aggregati.DDD: Root aggregati
Ho 3 Entità: Piano, PlannedRole e PlannedTraining. Ogni Piano può includere molti PlannedRoles e PlannedTrainings.
Soluzione 1: All'inizio ho pensato Plan è la radice aggregato perché PlannedRole e PlannedTraining non hanno senso fuori del contesto di un piano. Sono sempre all'interno di un piano. Inoltre, abbiamo una regola aziendale che dice che ogni Piano può avere un massimo di 3 PlannedRoles e 5 PlannedTrainings. Così ho pensato nominando il Piano come radice aggregata, posso far valere questo invariante.
Tuttavia, abbiamo una pagina di ricerca in cui l'utente cerca Piani. I risultati mostrano alcune proprietà del Piano stesso (e nessuna delle sue PlannedRoles o PlannedTrainings). Ho pensato che se dovessi caricare l'intero aggregato, ci sarebbe un sacco di spese generali. Ci sono quasi 3000 piani e ognuno può avere alcuni bambini. Caricare tutti questi oggetti insieme e quindi ignorare PlannedRoles e PlannedTrainings nella pagina di ricerca non ha senso per me.
Soluzione 2: Ho appena realizzato che l'utente vuole altre 2 pagine di ricerca dove possono cercare per i ruoli pianificate o previste Training. Questo mi ha fatto capire che stanno cercando di accedere a questi oggetti in modo indipendente e "fuori" dal contesto di Plan. Quindi ho pensato di sbagliarmi sul mio progetto iniziale ed è così che ho trovato questa soluzione. Quindi, ho pensato di avere 3 aggregati qui, 1 per ogni entità.
Questo approccio mi consente di cercare ciascuna Entità in modo indipendente e risolve anche il problema di prestazioni nella soluzione 1. Tuttavia, utilizzando questo approccio non riesco a far rispettare l'invariante che ho menzionato prima.
c'è anche un altro invariante che indica un piano può essere modificato solo se è di un certo status. Pertanto, non dovrei essere in grado di aggiungere alcun PlannedRoles o PlannedTrainings a un Piano che non è in tale stato. Di nuovo, non posso far valere questa invariante con il secondo approccio.
Qualsiasi consiglio sarebbe molto apprezzato.
Cheers, Mosh
Ciao David, Grazie per la tua risposta. Sembra essere una grande idea! Sì, ho letto qualcosa di simile da qualche parte prima ma l'autore non ha approfondito i dettagli di questo. Credo che i risultati della ricerca siano più simili a un rapporto e non vale la pena leggere l'intero aggregato ai fini della segnalazione, poiché i dati sono di sola lettura. Non apporteremo alcuna modifica, quindi nessuna invariante dovrebbe essere applicata, quindi non è richiesto alcun Aggregato! Grande idea! :) Avete qualche esempio di implementazione? O conosci qualche pagina web che ne parli di più? – Mosh
OK, ho aggiunto un esempio alla mia risposta - si spera che vi dia qualche idea! Temo di non conoscere alcun collegamento, dato che sono arrivato io stesso a questa implementazione dopo aver postato la domanda :) P.S. Se questo ti ha aiutato a risolvere il tuo problema, non dimenticare di contrassegnarlo come risposta: D –
Grande implementazione! Sei un genio David! Grazie uomo. – Mosh