CQRS / DDD + Sourcing di eventi. Il ReadModel può leggere se stesso?

2

Questa è una domanda per le volte in cui stai creando il modello di lettura per gestori di eventi.

La domanda si riduce a: come può un gestore di eventi attingere da altre fonti di informazioni rispetto a ciò che è contenuto nell'evento gestito stesso per costruire un modello di lettura?

Ho due aggregati, Persona e Indirizzo . Una persona può essere associata a diversi indirizzi (casa, lavoro, ecc.)

Quindi ho una tabella dei modelli di lettura Indirizzi (ID, riga1, riga2, riga3, ecc.)

Ho anche una tabella dei modelli di lettura PersonAddresses (PersonID, AddressID, line1, line2, line3) - Dati duplicati e denormalizzati.

  • Quando viene creato un indirizzo , invio un evento AddressRegistered con le informazioni sull'indirizzo (ID, Line1, Line2, ecc.).

  • Quando un indirizzo è associato a Person , invio un evento AddressAssociated (con PersonId, AddressId).

Quindi, voglio creare il readModel.

  • Quando ricevo un evento AddressRegistered , aggiungo una voce nella Addresses tabella dei modelli letti

  • Quando ricevo un evento AddressAssociated , voglio aggiungere una voce nella tabella dei modelli letti PersonAddresses .

Tuttavia, mi piacerebbe avere anche le informazioni sull'indirizzo (Linea1, Linea2, Linea3) nella tabella PersoneAddresse poiché la mia applicazione clien la utilizzerà in questo modo. Ma queste informazioni non sono contenute nell'evento AddressAssociated . Questo evento contiene solo PersonID e AddressId .

Qual è il modo più consigliato per ottenere tali informazioni (Linea1, Linea2, Linea3) per l'associato Indirizzo nel gestore di eventi AddressAssociated per popolare PersonAdresses leggi la tabella dei modelli?

  • Nel dominio, collega le informazioni sull'indirizzo (Linea1, Linea2, ...) all'evento IndirizzoAssociato in modo che possa essere aggiunto direttamente nella tabella PersoneAddresse ? Ciò richiederebbe un servizio di dominio in quanto avrebbe bisogno di cercare più aggregati. (Indirizzo e Persona sono due aggregati)
  • Quando aggiungi voci nel PersonAddresses , recupera le informazioni in precedenza dalla Addresses tabella dei modelli letti? È raccomandato che il modello letto sia letto da solo (consistenza finale, ecc.)?
  • Qualcos'altro?
posta Ludovic C 08.09.2016 - 16:39
fonte

2 risposte

1

È consentito creare le proiezioni del modello letto come necessario, e puoi leggere lo stato del modello di lettura corrente per aggiornarlo oppure, puoi impostare una pipeline dove leggi e amp; aggiornare lo stato del modello di lettura interno e da ciò (ri) creare le proiezioni del modello letto.

In un certo senso, stai sempre aggiornando la tua immagine del modello di lettura del mondo basata sull'ultima immagine di quel mondo + l'effetto dell'applicazione del prossimo evento. Quindi, leggere il modello di lettura è naturale.

Comunque, in qualsiasi modo tu lo faccia, devi essere sicuro di consumare gli eventi (applicare gli eventi dall'origine dell'evento / log al modello letto) nell'ordine (corretto) e usare abbastanza atomicità transazionale in modo che i consumatori a valle vedi sempre una vista completa dello stato, che è al 100% il vecchio stato prima di applicare un evento, o 100% il nuovo stato dopo aver applicato un evento.

L'uniformità finale indica che quando gli eventi in arrivo vengono interrotti per un breve periodo, la pipeline del modello letto viene raggiunta. Tuttavia, sarebbe scorretto esporre tramite il modello di lettura, uno stato incoerente (uno stato che non è mai stato una vera immagine del mondo), in cui, alcune modifiche sono applicate solo parzialmente alle proiezioni del modello letto o agli effetti di un evento successivo viene mostrato prima degli effetti di uno precedente; questo anche se lo stato alla fine converge su una vera immagine del mondo.

È ancora possibile leggere il modello letto durante l'aggiornamento del modello letto dagli eventi nel registro eventi.

Tuttavia, ci sono alcuni sostenitori dell'arricchimento degli eventi, in cui fai ciò che stai dicendo per l'opzione 1; vedi: link , link

Penso che continuerei a preferire vedere questo come una funzione del modello di lettura nel generare le sue proiezioni denormalizzate piuttosto che una funzione di dominio, dal momento che non è propriamente una funzione aziendale in se, ma piuttosto quella di creare il diritto la visualizzazione e il solo mantenimento del modello di lettura disaccoppiano il comando e interrogano di più dal punto di vista della manutenzione.

    
risposta data 08.09.2016 - 17:51
fonte
0

What is the most recommended way of getting that information (Line1, Line2, Line3) for the associated Address in the AddressAssociated event Handler in order to populate the PersonAdresses read model table?

Per la tua situazione? Non farlo in questo modo.

  • Registrare gli indirizzi nella tabella Indirizzi come prima.
  • Associa gli indirizzi in una tabella di associazione separata, che può essere unita alla tabella Indirizzo su AddressId
  • Crea PersonAddresses come vista che può essere interrogata dall'applicazione client.

Ma in una circostanza in cui tale approccio non funziona (scrivendo in due diversi negozi di persistenza, ad esempio), la risposta è di tenere traccia dello stato di cui si ha bisogno nel gestore dell'evento stesso - analogo all'unione dei due tabelle "in memoria" e scrivendo la rappresentazione che si desidera.

    
risposta data 08.09.2016 - 18:42
fonte

Leggi altre domande sui tag