async Task <T> LoadInternal <T>(StreamName streamName, bool failIfNotFound, CancellationToken cancellationToken) where T : Aggregate { var aggregate = _factoryRegistry.CreateInstance <T>(); try { var events = await _eventReader.ReadStream( streamName, StreamReadPosition.Start, failIfNotFound, cancellationToken ); foreach (var streamEvent in events) { Fold(streamEvent); } } catch (StreamNotFound) when(!failIfNotFound) { return(aggregate); } catch (Exception e) { Log.UnableToLoadAggregate <T>(streamName, e); throw e is StreamNotFound ? new AggregateNotFoundException <T>(streamName, e) : e; } return(aggregate); void Fold(StreamEvent streamEvent) { var evt = streamEvent.Payload; if (evt == null) { return; } aggregate.Fold(evt); } }