Mi sono imbattuto nel design di Event Sourcing e vorrei utilizzarlo in un'applicazione in cui è necessario un client REST (RESTful per essere precisi). Tuttavia, non riesco a collegarli insieme poiché REST è abbastanza simile a CRUD e l'approvvigionamento di eventi è basato su attività. Mi chiedevo come puoi progettare la creazione di comandi in base alle richieste al server REST. Considera questo esempio:
Con REST è possibile inserire un nuovo stato nella risorsa chiamata File. In una richiesta è possibile inviare un nuovo nome di file, è possibile modificare la cartella principale e / o cambiare il proprietario del file e così via.
Come costruire il server in modo da poter utilizzare il sourcing degli eventi. Stavo pensando a queste possibilità:
Determinare il server di quali campi sono stati modificati e creano comandi appropriati (
RenameFileCommand
,MoveFileCommand
,ChangeOwnerCommand
, ...) e la spedizione questi singolarmente. Tuttavia, in questa configurazione, ciascuno dei comandi può non riuscire a lasciare gli altri fuori transazione e quindi fuori dalla modifica "atomica" della risorsa.Invio solo comando (
UpdateFileCommand
) e nel gestore comando, più precisamente nel complesso, determinare quali campi sono stati modificati e inviare singoli eventi invece (FileRenamedEvent
,FileMovedEvent
,OwnerChangedEvent
, ...)Questo non mi piace affatto: nella richiesta al server vorrei specificare nelle intestazioni quale comando usare, perché l'interfaccia utente è ancora basata su attività (ma la comunicazione avviene tramite REST). Tuttavia fallirà in qualsiasi altro uso della comunicazione REST (ad es. In app esterne) poiché non sono tenuti a modificare solo un campo in una richiesta. Inoltre porto un accoppiamento piuttosto grande nell'interfaccia utente, REST e back-end basato su ES.
Quale preferiresti o c'è un modo migliore per gestirlo?
Nota a margine: app scritta in Java e Axon Framework per l'approvvigionamento di eventi.