La differenza tra un comando e un evento nella comunicazione bus sembra un po 'vaga per me. So che i comandi dovrebbero essere eseguiti una sola volta, mentre un evento può essere gestito più volte, ma non sono ancora sicuro di 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'e-mail di conferma.
Creazione dell'account : questo sembra essere il posto giusto per inviare un CreateUserCommand
bus al bus e lasciare che un componente specializzato lo gestisca.
O forse questo non dovrebbe nemmeno essere implementato con una comunicazione bus asincrona? Vogliamo che l'utente sia in grado di accedere immediatamente all'applicazione. Con il bus non abbiamo alcuna garanzia quando verrà eseguito il comando.
Invio di e - mail : dopo che il componente ha creato l'account, vedo 2 possibilità
- Invia un altro comando al bus
SendConfirmationEmailCommand
- Pubblica un evento
UserAccountCreatedEvent
E poi lascia che il componente mittente e-mail lo afferri e al suo lavoro.
Da un lato, voglio che l'e-mail di conferma venga inviata una sola volta (utilizzare un comando), dall'altro lato, credo che possano esserci più componenti interessati agli utenti appena registrati. Un logger o forse un mittente SMS.
Come lo implementeresti?