Gestione del comportamento dell'applicazione non di dominio in CQRS

4

Ecco uno scenario.

Sto costruendo QueueUnderflow , un sito di Q & community-edited per persone che non hanno ancora compreso le basi delle strutture dati. Ai miei utenti non piace quando le persone modificano i loro post così, perché voglio incoraggiare il maggior numero possibile di conflitti, voglio inviare notifiche via email ogni volta che il post di un utente viene modificato in modo che possa accedere e insultare l'editor.

Sto sperimentando con CQRS. Non sto utilizzando il sourcing di eventi e ho un singolo data store ma I am utilizzo di gestori di eventi per gestire la persistenza di eventuali cambiamenti di stato.

In una normale applicazione N-Tier / CRUD questo potrebbe essere attivato da una facciata di un'applicazione o da un livello di servizio. Nella mia architettura CQRS, posso vedere alcune opzioni:

  1. Il gestore di eventi: mi piace questa idea perché sembra che l'invio di un'e-mail di notifica sia una preoccupazione che potrebbe risiedere in una parte indipendente del sistema che desidera ascoltare il momento opportuno per inviare una e-mail e quindi inviarlo, trasparente al resto del sistema. Non mi piace questa idea perché Greg Young (ragionevolmente) sottolinea nei suoi video che se io avessi per introdurre il sourcing di eventi, ciò avrebbe comportato l'invio di email di notifica potenzialmente molte volte.
  2. Il gestore di comandi: questo è un approccio più esplicito che ha ancora senso per me; tuttavia, sembra che il consenso generale sia che i gestori di comandi dovrebbero essere solo per il coordinamento di oggetti di dominio e non per il comportamento direttamente performante.
  3. Il dominio: sembra sbagliato. L'invio di e-mail di notifica è una preoccupazione dell'applicazione, non tanto del dominio che riguarda principalmente la logica di business.
  4. Il livello di presentazione (o potenzialmente una facciata di un'applicazione intermedia che passa semplicemente un comando al suo gestore ed esegue altre azioni specifiche dell'applicazione come l'invio di notifiche).

La domanda è: quale parte della mia architettura è responsabile per l'invio di e-mail?

    
posta Ant P 13.08.2014 - 17:24
fonte

2 risposte

3

Il numero 1 salta fuori come un modo elegante per farlo. Puoi approfondire il motivo per cui Event Sourcing comporterebbe l'invio delle stesse e-mail più volte? I sistemi ES normalmente hanno modi per distinguere tra quando un evento viene generato per la prima volta e quando viene riapplicato successivamente. Vedi la riga 90 di questo codice da uno dei repository di Greg Young.

2. è anche un'opzione se si considera il gestore di comandi come un servizio dell'applicazione. L'invio di notifiche può essere visualizzato come dipendente dall'applicazione - se il contesto applicativo è un programma batch UI-less che modifica migliaia di post, forse non si desidera che le e-mail vengano inviate.

    
risposta data 12.11.2014 - 13:43
fonte
0

Il gestore comandi non dovrebbe eseguire un comportamento che modifichi lo stato interno, ma l'aggiunta del comportamento necessario per completare il comando è accettabile.

Ad esempio: un comando ChargeCreditCard deve contattare il fornitore del commerciante per determinare se l'addebito ha esito positivo, quindi deve essere parte della gestione dei comandi.

Il gestore comandi invia il risultato come evento CreditCardCharged o CreditCardDeclined che modifica lo stato dell'applicazione.

Se è richiesto che venga inviata una notifica per ogni addebito, deve anche essere parte della gestione dei comandi.

    
risposta data 13.08.2014 - 23:25
fonte

Leggi altre domande sui tag