Пример #1
0
        public IAggregateRoot Get(Type aggregateRootType, string aggregateRootId)
        {
            if (aggregateRootId == null)
            {
                throw new ArgumentNullException("aggregateRootId");
            }

            var aggregateRoot = default(IAggregateRoot);

            CompatibleStyle compatibleStyle = CompatibleStyle.EventSourcingOnly;

            ICompatibleStoreHandler aggregateInitEventHandler = _compatibleStoreHandlerProvider.GetHandler(aggregateRootType);

            if (aggregateInitEventHandler != null)
            {
                compatibleStyle = aggregateInitEventHandler.GetCompatibleStyle();
            }

            if (compatibleStyle == CompatibleStyle.EventSourcingOnly)
            {
                if (TryGetFromSnapshot(aggregateRootId, aggregateRootType, out aggregateRoot))
                {
                    return(aggregateRoot);
                }
            }

            if (TryGetFromCompatibleAggregateStore(aggregateRootId, aggregateRootType, aggregateInitEventHandler, compatibleStyle, out aggregateRoot))
            {
                return(aggregateRoot);
            }

            return(null);
        }
Пример #2
0
        private bool TryGetFromCompatibleAggregateStore(string aggregateRootId, Type aggregateRootType,
                                                        ICompatibleStoreHandler aggregateInitHandler, CompatibleStyle compatibleStyle, out IAggregateRoot aggregateRoot)
        {
            aggregateRoot = null;
            var aggregateRootTypeCode = _aggregateRootTypeCodeProvider.GetTypeCode(aggregateRootType);

            if (compatibleStyle == CompatibleStyle.RepositoryOnly)
            {
                // Replay Repository Aggregate Init Event
                DomainEventStream aggregateInitEvent = aggregateInitHandler.GetAggregateRestoreEventStream(aggregateRootId);
                if (aggregateInitEvent != null)
                {
                    if (aggregateInitEvent.AggregateRootId != aggregateRootId)
                    {
                        throw new Exception(string.Format("DomainEventStream.AggregateRootId error: {0}, expected aggregate root id:{1}", aggregateInitEvent.AggregateRootId, aggregateRootId));
                    }
                    aggregateRoot = _aggregateRootFactory.CreateAggregateRoot(aggregateRootType);
                    aggregateRoot.RestoreFromEvents(aggregateInitEvent);
                    return(true);
                }
                return(false);
            }
            else if (compatibleStyle == CompatibleStyle.RepositoryThenEventSourcing)
            {
                var versionStart = minVersion;

                // Replay Repository Aggregate Init Event
                //IDomainEvent aggregateInitEvent = _compatibleAggregateStore.GetAggregateInitEvent(aggregateRootType, aggregateRootId);
                DomainEventStream aggregateInitEvent = aggregateInitHandler.GetAggregateRestoreEventStream(aggregateRootId);
                if (aggregateInitEvent != null)
                {
                    if (aggregateInitEvent.AggregateRootId != aggregateRootId)
                    {
                        throw new Exception(string.Format("DomainEventStream.AggregateRootId error: {0}, expected aggregate root id:{1}", aggregateInitEvent.AggregateRootId, aggregateRootId));
                    }
                    aggregateRoot = _aggregateRootFactory.CreateAggregateRoot(aggregateRootType);
                    aggregateRoot.RestoreFromEvents(aggregateInitEvent);
                    versionStart = aggregateInitEvent.Version + 1;
                }

                // Replay Event Sourcing Events
                var eventStreams = _eventStore.QueryAggregateEvents(aggregateRootId, aggregateRootTypeCode, versionStart, maxVersion);
                if (eventStreams == null || !eventStreams.Any())
                {
                    if (aggregateRoot != null)
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                aggregateRoot.ReplayEvents(eventStreams);
                return(true);
            }
            else //if(compatibleStyle == CompatibleAggregateInitStyle.EventSourcingOnly)
            {
                // Replay Event Sourcing Events
                var versionStart = minVersion;
                var eventStreams = _eventStore.QueryAggregateEvents(aggregateRootId, aggregateRootTypeCode, versionStart, maxVersion);
                if (eventStreams == null || !eventStreams.Any())
                {
                    return(false);
                }
                aggregateRoot = _aggregateRootFactory.CreateAggregateRoot(aggregateRootType);
                aggregateRoot.ReplayEvents(eventStreams);
                return(true);
            }
        }
Пример #3
0
 public CompatibleStoreHandlerWrapper(ICompatibleStoreHandler <TAggregateRootType> aggregateInitEvent)
 {
     _aggregateInitEvent = aggregateInitEvent;
 }