Пример #1
0
    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);
        }
    }