Sono un po 'confuso riguardo al flusso in un sistema che utilizza eventi di dominio per creare il modello letto. In particolare, come affrontiamo il fatto che l'utente si aspetta che i dati (e la sua vista) cambino quando completano un comando, ma a causa della nostra architettura di sistema (chiamate non bloccanti per pubblicare eventi) il database effettivo potrebbe non cambiare prima del la pagina è ricaricata?Visualizzazione delle modifiche in Visualizza quando si utilizza CQRS e DDD con Domain Events & ServiceBus
Spero di spostare la progettazione di uno dei nostri sistemi più in linea con CQRS utilizzando eventi e un bus di servizio.
Diciamo che il mio flusso va come ad esempio: il tasto scatta
utente in Vista per eseguire compito di rimuovere Metodo di pagamento dal loro account.
Il controller chiama PaymentMethodRemovalService, passando il suo accountId & paymentMethodId.
Controller utilizza AccountRepository per recuperare account e chiama account.RemovePaymentMethod (id)
account convalida può accadere che il funzionamento e pubblica evento PaymentMethodRemovedMessage (accountid, paymentMethodId)
Perché la pubblicazione eventi è asincrona, ora dobbiamo tornare dal servizio e restituire la vista dal controller - ma i nostri dati attuali non sono ancora aggiornati!
Un gestore, IHandle < PaymentMethodRemovedMessage>, sente l'evento e rimuove la riga reale dal DB
Allora, che cosa è un ragazzo di fare?
Potrei semplicemente, ad esempio, rimuovere il div che stava visualizzando il metodo di pagamento. Questo potrebbe funzionare in uno scenario AJAX, ma cosa succede se sto usando Post-Redirect-Get per supportare client non JavaScript. Quindi sparerò il mio Get e leggerò i dati dal lato Query delle cose, potenzialmente prima che vengano aggiornate.
Viene visualizzata una notifica in cui è stata inviata la richiesta di rimozione del metodo di pagamento? (Che non sembra amichevole, ha senso per l'invio di un ordine, ma non per, diciamo, cambiando un indirizzo).
Esiste un modo per riconciliare le modifiche di implementazione come eventi asincroni disaccoppiati e mostrare i dati utente che riflettono la loro modifica corrente?
EDIT: La mia domanda è molto simile a CQRS, DDD synching reporting database devo dire, la risposta data lì e anche accennato qui, ha un po 'di un odore ad esso - litigare l'interfaccia utente per mostrare un aggiornamento che è fuori della band con il DB letto, per così dire. Speravo in qualcosa di un po 'più pulito.