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