Passando informazioni Meta dal comando tramite Aggrega all'evento

1

Ho un sistema CQRS in fase di sviluppo che passa il comando a un CommandHandler, che ottiene un aggregato da un repository e chiama un metodo con le proprietà del comando (convertito in ValueObjects).

Il metodo crea quindi l'evento internamente e lo registra in un oggetto hash da raccogliere e conservare in seguito.

Ho alcuni metadati che devono venire dalla richiesta iniziale e essere mantenuti con l'Evento risultante, e sono detestato di dover passare questo attraverso il metodo sull'Agenda che IMO dovrebbe riguardare solo il dominio stesso, e non i dati relativi ai messaggi.

Il problema che ho è che ogni singolo metodo pubblico nel dominio dovrà accettare questo meta oggetto; mi sembra ridicolo. Anche un metodo che normalmente non avrebbe parametri (come un metodo toggleSomeState() ).

Quindi, la mia domanda è: qualcuno può fornire un esempio decente di come i meta dati possano aggirare l'Aggregato, ma finire nell'Evento dall'altra parte?

Aggiornamento:

Ecco una spiegazione dei metadati. Al momento disponiamo di due Uuid che sono stati utilizzati per l'autenticazione e, data la natura del dominio come sistema multi-tenantato, questi uuid devono essere mantenuti per tutta la durata dell'applicazione. Naturalmente, se ne avrò due ora, avrò più tardi;) Questo è un altro motivo per cui non voglio passarli nei metodi aggregati.

Inoltre, da un commento, ho appreso che una volta che un evento è stato prodotto, è immutabile. Come potrei quindi sentirmi a mio agio nel consentire al sistema di modificare quell'evento prima della persistenza per aggiungere questo metadati? È questa una di quelle occasioni di compromesso con cui dovrei convivere?

    
posta designermonkey 17.04.2018 - 18:11
fonte

1 risposta

1

Non c'è magia.

I metadati hanno una durata nell'intero ambito della richiesta, quindi dovrai tracciare un percorso da dove inizia a dove finisce.

Ora, se si tratta di metadati, in realtà il modello di dominio non dovrebbe preoccuparsene, quindi preferiresti che il percorso non passi esplicitamente attraverso il modello.

Ci sono almeno due possibilità su come ottenere ciò.

Uno è guardare alla creazione degli eventi stessi - è possibile utilizzare una fabbrica per creare nuovi eventi e iniettare una fabbrica che è stata inizializzata con i metadati. La fabbrica di eventi agisce in effetti come un'interfaccia collaborativa tra il tuo modello di dominio e le rappresentazioni di eventi che archivi.

(Stavi già creando eventi all'interno della tua logica di dominio, quindi la factory ha un'esistenza almeno implicita nel tuo dominio, tutto ciò che stiamo facendo è rendere esplicita quell'esistenza e fornirgli scope di richiesta).

Un'altra possibilità è di considerare "accodare" i metadati alle rappresentazioni man mano che le scrivi. Ognuna delle rappresentazioni degli eventi viene trasformata aggiungendo i metadati ad essa, nell'ambito della richiesta, ma prima di scriverli nel negozio.

    
risposta data 18.04.2018 - 15:31
fonte