La differenza tra un comando e un evento nella comunicazione in autobus mi sembra un po 'vaga. So che i comandi dovrebbero essere eseguiti una sola volta, mentre un evento può essere gestito più volte, ma ancora non sono sicuro quando utilizzare un comando o un evento.
Diamo un'occhiata a un esempio:
Quando un nuovo utente si registra in un'applicazione web, dovremmo creargli un account e inviare un'email di conferma.
Creazione dell'account : questo sembra essere il posto giusto per inviare un CreateUserCommand
al bus e consentire a un componente specializzato di gestirlo.
O forse questo non dovrebbe nemmeno essere implementato con una comunicazione bus asincrona? Vogliamo che l'utente possa accedere subito all'applicazione. Con il bus non abbiamo alcuna garanzia di esecuzione del comando.
Invio di email - dopo che il componente ha creato l'account, posso vedere 2 possibilità
- Invia un altro comando al bus
SendConfirmationEmailCommand
- Pubblica un evento
UserAccountCreatedEvent
E poi lasciare che il componente del mittente della posta elettronica lo catturi e al suo posto di lavoro.
Da una parte voglio che l'e-mail di conferma sia inviata una sola volta (usa un comando), d'altra parte, credo che ci possano essere più componenti interessate ai nuovi utenti registrati. Un logger o forse un mittente SMS.
Come lo implementeresti?