public async Task Save(IEventSourceAggregate aggregate, CancellationToken cancellationToken = default) { var streamStoreTask = _streamStoreFactory.GetStreamStore(cancellationToken: cancellationToken); aggregate = aggregate.ThrowIfNull(nameof(aggregate)); var events = aggregate.GetUncommittedEvents().ToArray(); if (!events.Any()) { return; } var streamId = GetStreamId(aggregate); var originalVersion = aggregate.Version - events.Length; var expectedVersion = originalVersion == 0 ? ExpectedVersion.NoStream : originalVersion - 1; var messagesToPersist = events.Select(evt => evt.ToMessageData()).ToArray(); var streamStore = await streamStoreTask.ConfigureAwait(false); await streamStore.AppendToStream(streamId, expectedVersion, messagesToPersist, cancellationToken); // We get all the way through the process, then we clear the uncommitted events. They are now processed, they are no longer *un*committed aggregate.ClearUncommittedEvents(); }
public AggregateDeletedException(IEventSourceAggregate aggregate) : base( $"Aggregate {aggregate.GetType().Name} with identifier {aggregate.Id} was in a deleted state") { }
public string GetStreamId(IEventSourceAggregate aggregate) => GenerateStreamId(aggregate.GetType().Name, aggregate.Id);