Devo usare un comando o un evento?

9

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à

  1. Invia un altro comando al bus SendConfirmationEmailCommand
  2. 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?

    
posta Andrzej Gis 02.10.2016 - 14:09
fonte

1 risposta

8

In linea di principio, un comando descrive una richiesta che deve essere eseguita, mentre un evento descrive qualcosa che è accaduto:

  • Un comando richiede che un'azione venga eseguita da un processore e questa azione deve essere eseguita solo una volta da questo processore.

  • Un evento è la notifica di un'azione già eseguita o di un evento esterno. Diversi processori / agenti potrebbero essere interessati a conoscere l'evento. Molti di loro possono emettere ulteriori comandi o azioni richiesti da questa notifica nel loro dominio di responsabilità.

Nel tuo scenario, capisco che:

  • CreateUserCommand è un comando
  • UserAccountCreatedEvent è un evento che dovrebbe essere emesso quando CreateUserCommand è completata con successo dal servizio di gestione account

Ora ci sono due possibilità:

  1. Il servizio di gestione degli account emette un SendConfirmationEmailCommand sul bus, poiché prevede che questo comando venga eseguito da un servizio più specializzato.
  2. Il servizio di gestione degli account non fa altro che inviare la notifica dell'evento al completamento e lascia a un altro servizio (ad esempio servizio di comunicazione, servizio di abbonamento, ecc.) la decisione se inviare o meno email / sms / ecc. e, se necessario, emettere un comando SendConfirmationEmailCommand da eseguire da qualche gateway.

Se hai optato per un approccio al bus di servizio, sarebbe logico utilizzare la flessibilità consentita, ad esempio per favorire l'opzione 2.

    
risposta data 02.10.2016 - 16:20
fonte

Leggi altre domande sui tag