public async Task AppendAsync(
            IAggregateId aggregateId,
            IReadOnlyList <IDomainEvent> domainEvents,
            long expectedVersion)
        {
            if (domainEvents.Count > 0)
            {
                var connection = await _connectionProvider.GrabConnection();

                var results = await connection.ConditionalAppendToStreamAsync(
                    aggregateId.ToStreamName(_eventStoreName),
                    expectedVersion,
                    domainEvents.Select(e => e.ToEventData()));

                switch (results.Status)
                {
                case ConditionalWriteStatus.Succeeded:
                    break;

                case ConditionalWriteStatus.VersionMismatch:
                    throw new VersionMismatchException(aggregateId.ToStreamName(_eventStoreName), expectedVersion);

                case ConditionalWriteStatus.StreamDeleted:
                    throw new StreamDeletedException(aggregateId.ToStreamName(_eventStoreName));

                default:
                    throw new ArgumentOutOfRangeException(nameof(results.Status), results.Status.ToString());
                }
            }
        }
        public async Task <IReadOnlyList <IDomainEvent> > AsyncLoadAllEventsFor(IAggregateId aggregateId)
        {
            var connection = await _connectionProvider.GrabConnection();

            var resolvedEvents = await connection.ReadAllStreamEventsForward(aggregateId.ToStreamName(_eventStoreName));

            return(resolvedEvents.Select(e => e.Event.ToDomainEvent()).ToList());
        }