La risposta della domanda si trova nel significato di "aggregato".
Come prima cosa direi che non stai modificando gli aggregati "n", ma stai modificando le entità "n".
Ora, perché si dovrebbe modificare più di un aggregato con un comando?
Se ritieni che ciò sia necessario, prima di fare qualsiasi altra cosa controlla i tuoi limiti aggregati per vedere se è possibile modificarlo per rimuovere il comando 1 necessario -> 'n' aggregato.
Un aggregato può contiene un sacco di enti dello stesso tipo, quindi per il vostro comando PurgeAllCompletedTodos, si potrebbe anche pensare a espandere il limite di transazione da un unico Todo ad un aggregato UserTodosAggregate che contiene tutte le user todos, e lascia che gestisca tutti i comandi per i todos di un singolo utente.
In questo modo è possibile modificare tutte le situazioni di un utente in una singola transazione.
Se questo non risolve il problema perché, diciamo che è necessario eliminare tutti i todos completati di ciascun utente nell'applicazione, sarà comunque necessario inviare un comando a aggregati 'n', il limite aggregato non Aiuta, quindi, possiamo pensare di avere un AllApplicationTodosAggregate che gestisce il comando.
Probabilmente questa non è la soluzione migliore, perché come hai detto che il comando bloccherebbe TUTTI i todos dell'applicazione, ma, controlla sempre se può essere un buon compromesso (questa parte del blocco è spiegata molto bene in sia Blue Book che Red Book of DDD).
Cosa succede se ho bisogno di modificare alcune entità e non posso averle in un unico aggregato?
Con il precedente, un comando che modifica più di un aggregato è danneggiato a causa delle transazioni. Cosa succede se si modifica 3 aggregato, il primo è buono, e quindi il server è spento?
In questo caso, ciò che si sta facendo è avere una singola modifica che deve essere gestita per evitare l'incoerenza del sistema. L'operazione può essere eseguita utilizzando un gestore di processi, in cui le responsabilità modificano tutti gli aggregati inviando loro il comando corretto e gestendo i guasti se si verificano.
Un aggregato ancora ricevere il proprio comando, ma il gestore del processo ha il compito di inviare loro in un modo che conosce (uno alla volta, tutti in parallelo, 5 per volta, che cosa-do-you-want)
Quindi puoi avere una strategia per gestire l'errore tra due transazioni e prendere una decisione del tipo: "se qualcosa fallisce, ripristina tutte le modifiche fatte fino ad ora" (inviando un comando di rollback a ogni aggregato), o "se un'operazione fallisce ripetere 3 volte ogni 30 minuti e se non funziona non funziona "rollback", "se qualcosa fallisce crea una notifica per l'amministratore di sistema".
(dispiace per il lungo post, almeno spero che aiuta)
"Può un evento * non * aggiornare qualsiasi stato del dominio a tutti?" e "Perché limitare comandi ed eventi a 1 aggregato?" mi sembrano due domande separate e non correlate. – guillaume31
Sì hai ragione. Modificheremo la domanda –
Qui ho spostato l'altra parte della mia domanda qui: http://stackoverflow.com/questions/32823747/in-es-cqrs-ddd-can-a-event-not-update-any-real-domain-state- tutto sommato –