Ho una domanda riguardante gli aggiornamenti di più aggregati in una singola transazione utilizzando JOliver's Event Store. Come ho capito, ogni aggregato dovrebbe avere il proprio flusso di eventi. Ora, mentre molti gestori di comandi caricano solo un singolo aggregato e aggiornano solo quell'aggregato (ad esempio, salvano gli eventi per tali aggregati), posso immaginare che ci saranno gestori di comandi che devono aggiornare più aggregati. E, naturalmente, mi piacerebbe farlo in modo transazionale.Aggiornamento di più aggregati utilizzando JOliver EventStore
Tuttavia, non vedo come potrei farlo con l'Event Store. La memorizzazione degli eventi viene effettuata chiamando lo CommitChanges()
su un flusso di eventi. Se stiamo aggiornando più aggregati, avremo più stream di eventi e quindi più chiamate a CommitChanges()
. L'unico modo per renderlo transazionale è quello di racchiuderlo in un TransactionScope
, ma ciò non ha molto senso, poiché la tecnologia di archiviazione sottostante potrebbe non supportare le transazioni. Così io alla fine con questo codice, che è sicuramente non è quello che sto cercando:
Guid aggregateGuid1 = Guid.NewGuid();
Guid aggregateGuid2 = Guid.NewGuid();
Guid commitGuid = Guid.NewGuid();
var stream = store.OpenStream(aggregateGuid1, 0, int.MaxValue);
stream.Add(new EventMessage() { Body = new MonitorDisabled { MonitorGuid = aggregateGuid1, User = "A" } });
stream.CommitChanges(commitGuid);
stream = store.OpenStream(aggregateGuid2, 0, int.MaxValue);
stream.Add(new EventMessage() { Body = new MonitorEnabled { MonitorGuid = aggregateGuid2, User = "B" } });
// Can't commit twice with the same commit id, what if fails after first one? No way for the store to know it had to write the second part of the commit.
stream.CommitChanges(commitGuid);
Questo mi fa sentire che sono qualcosa di completamente mancante su come deve essere utilizzato l'evento di archivio. Qualcuno potrebbe aiutarmi qui? Molte grazie!
Ora, supponiamo che siamo in hosting business e stiamo gestendo server in stanze in rack nei data center. E ogni server è monitorato da una serie di monitor, chiamiamolo una configurazione del monitor. Ora, vogliamo disabilitare i monitor durante la manutenzione. E, possiamo fare manutenzione su server, rack, stanze o centri dati completi. La configurazione del monitor è un aggregato naturale per i monitor per un server, vogliamo generare eventi MonitorDisabled sull'aggregato di configurazione del monitor quando mettiamo un rack in manutenzione. Dove definiamo il limite TX? Il server, il rack, la stanza, ...? – Jochen
Se si dispone di limiti di trascrizione che attraversano i confini aggregati, si sta facendo male. Per definizione, un aggregato è un confine transazionale e il tuo modello dovrebbe riflettere questo. –