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);