Esempio n. 1
0
        private TAggregateRootState CreateState(IEventStream stream)
        {
            Contract.Requires(stream != null);
            Contract.Ensures(Contract.Result <TAggregateRootState>() != null);

            var snapshotRevision = stream.FirstOrDefault(x => x is SnapshotRevision) as SnapshotRevision;

            // order domain events and flatten list
            IReadOnlyCollection <IDomainEvent> domainEvents = stream.Where(x => x is DomainEventRevision)
                                                              .OrderBy(x => x.Version)
                                                              .Cast <DomainEventRevision>()
                                                              .SelectMany(x => x.DomainEvents)
                                                              .ToList();

            var domainEventsExist = domainEvents.Any();

            TAggregateRootState state;

            // check for valid stream
            if (snapshotRevision == null)
            {
                if (domainEventsExist)
                {
                    // domain events only
                    state = _aggregateRootStateBuilder.Build(domainEvents);
                }
                else
                {
                    throw new InvalidOperationException("Event stream does not contain a snapshot or domain event revision.");
                }
            }
            else
            {
                if (domainEventsExist)
                {
                    // snapshot and domain events
                    state = _aggregateRootStateBuilder.Build(snapshotRevision.Snapshot.Data, domainEvents);
                }
                else
                {
                    // snapshot only
                    state = _aggregateRootStateBuilder.Build(snapshotRevision.Snapshot.Data);
                }
            }

            Contract.Assume(state != null);
            return(state);
        }