/// <inheritdoc />
        public async Task <TEntity> GetAsync(object id)
        {
            var aggregateRoot = AggregateFactory.Build(typeof(TEntity));

            var snapshot = await _snapshotReader.ReadSnapshot(id, typeof(TEntity));

            if (snapshot != null)
            {
                aggregateRoot.RestoreSnapshot(snapshot);
            }

            var streamName = StreamNameResolver.Resolve(id, typeof(TEntity));

            var slice = GetEventSlice(_connection, streamName, aggregateRoot.CurrentVersion == -1 ? StreamPosition.Start : aggregateRoot.CurrentVersion + 1);

            if (slice.Status == SliceReadStatus.StreamDeleted || slice.Status == SliceReadStatus.StreamNotFound)
            {
                return(await Task.FromResult(default(TEntity)));
            }

            aggregateRoot.LoadFromHistory(slice.Events.ToDomainEvent());

            while (!slice.IsEndOfStream)
            {
                slice = GetEventSlice(_connection, streamName, slice.NextEventNumber);
                aggregateRoot.LoadFromHistory(slice.Events.ToDomainEvent());
            }

            _unitOfWork.Track(aggregateRoot);

            return((TEntity)aggregateRoot);
        }