コード例 #1
0
ファイル: FileSystemSession.cs プロジェクト: Pondidum/Crispin
        public async Task <TAggregate> LoadAggregate <TAggregate>(object aggregateID)
        {
            Func <IEnumerable <IEvent>, object> builder;

            if (_builders.TryGetValue(typeof(TAggregate), out builder) == false)
            {
                throw new BuilderNotFoundException(_builders.Keys, typeof(TAggregate));
            }

            var aggregatePath = AggregatePath(_root, typeof(TAggregate), aggregateID);

            var fsEvents = await _fileSystem.FileExists(aggregatePath)
                                ? (await _fileSystem.ReadFileLines(aggregatePath))
                           .Select(e => JsonConvert.DeserializeObject(e, JsonSerializerSettings))
                           .Cast <IEvent>()
                                : Enumerable.Empty <IEvent>();

            var sessionEvents = _pending.EventsFor <TAggregate>(aggregateID);

            var events = fsEvents
                         .Concat(sessionEvents)
                         .ToArray();

            if (events.Any() == false)
            {
                throw new AggregateNotFoundException(typeof(TAggregate), aggregateID);
            }

            var aggregate = builder(events);

            return((TAggregate)aggregate);
        }
コード例 #2
0
        public Task <TAggregate> LoadAggregate <TAggregate>(object aggregateID)
        {
            Func <IEnumerable <IEvent>, object> builder;

            if (_builders.TryGetValue(typeof(TAggregate), out builder) == false)
            {
                throw new BuilderNotFoundException(_builders.Keys, typeof(TAggregate));
            }

            var eventsToLoad = new List <IEvent>();

            eventsToLoad.AddRange(_storeEvents.EventsFor <TAggregate>(aggregateID));
            eventsToLoad.AddRange(_pendingEvents.EventsFor <TAggregate>(aggregateID));

            if (eventsToLoad.Any() == false)
            {
                throw new AggregateNotFoundException(typeof(TAggregate), aggregateID);
            }

            var aggregate = builder(eventsToLoad);

            return(Task.FromResult((TAggregate)aggregate));
        }