예제 #1
0
        public async Task <IReadOnlyCollection <ICommittedDomainEvent> > CommitEventsAsync(
            IIdentity id,
            IReadOnlyCollection <SerializedEvent> serializedEvents,
            CancellationToken cancellationToken)
        {
            if (!serializedEvents.Any())
            {
                return(new List <ICommittedDomainEvent>());
            }

            using (await _asyncLock.WaitAsync(cancellationToken).ConfigureAwait(false))
            {
                var globalCount = _eventStore.Values.SelectMany(e => e).Count();

                List <InMemoryCommittedDomainEvent> committedDomainEvents;
                if (_eventStore.ContainsKey(id.Value))
                {
                    committedDomainEvents = _eventStore[id.Value];
                }
                else
                {
                    committedDomainEvents = new List <InMemoryCommittedDomainEvent>();
                    _eventStore[id.Value] = committedDomainEvents;
                }

                var newCommittedDomainEvents = serializedEvents
                                               .Select((e, i) =>
                {
                    var committedDomainEvent = new InMemoryCommittedDomainEvent
                    {
                        AggregateId             = id.Value,
                        AggregateName           = e.Metadata[MetadataKeys.AggregateName],
                        AggregateSequenceNumber = e.AggregateSequenceNumber,
                        Data                 = e.SerializedData,
                        Metadata             = e.SerializedMetadata,
                        GlobalSequenceNumber = globalCount + i + 1,
                    };
                    _log.Verbose("Committing event {0}{1}", Environment.NewLine, committedDomainEvent.ToString());
                    return(committedDomainEvent);
                })
                                               .ToList();

                var expectedVersion = newCommittedDomainEvents.First().AggregateSequenceNumber - 1;
                if (expectedVersion != committedDomainEvents.Count)
                {
                    throw new OptimisticConcurrencyException("");
                }

                committedDomainEvents.AddRange(newCommittedDomainEvents);

                return(newCommittedDomainEvents);
            }
        }
예제 #2
0
        public async Task <IReadOnlyCollection <ICommittedDomainEvent> > CommitEventsAsync(
            IIdentity id,
            IReadOnlyCollection <SerializedEvent> serializedEvents,
            CancellationToken cancellationToken)
        {
            if (!serializedEvents.Any())
            {
                return(new List <ICommittedDomainEvent>());
            }

            using (await _asyncLock.WaitAsync(cancellationToken).ConfigureAwait(false))
            {
                var globalCount = _eventStore.Values.Sum(events => events.Count);

                var newCommittedDomainEvents = serializedEvents
                                               .Select((e, i) =>
                {
                    var committedDomainEvent = new InMemoryCommittedDomainEvent
                    {
                        AggregateId             = id.Value,
                        AggregateName           = e.Metadata[MetadataKeys.AggregateName],
                        AggregateSequenceNumber = e.AggregateSequenceNumber,
                        Data                 = e.SerializedData,
                        Metadata             = e.SerializedMetadata,
                        GlobalSequenceNumber = globalCount + i + 1,
                    };
                    _log.Verbose("Committing event {0}{1}", Environment.NewLine, committedDomainEvent.ToString());
                    return(committedDomainEvent);
                })
                                               .ToList();

                var expectedVersion = newCommittedDomainEvents.First().AggregateSequenceNumber - 1;
                var lastEvent       = newCommittedDomainEvents.Last();

                var updateResult = _eventStore.AddOrUpdate(id.Value, s => new ImmutableEventCollection(newCommittedDomainEvents),
                                                           (s, collection) => collection.Count == expectedVersion
                        ? collection.Add(newCommittedDomainEvents)
                        : collection);

                if (updateResult.Last != lastEvent)
                {
                    throw new OptimisticConcurrencyException("");
                }

                return(newCommittedDomainEvents);
            }
        }
        public async Task<IReadOnlyCollection<ICommittedDomainEvent>> CommitEventsAsync(IIdentity id, IReadOnlyCollection<SerializedEvent> serializedEvents, CancellationToken cancellationToken)
        {
            if (!serializedEvents.Any())
            {
                return new List<ICommittedDomainEvent>();
            }

            using (await _asyncLock.WaitAsync(cancellationToken).ConfigureAwait(false))
            {
                var globalCount = _eventStore.Values.SelectMany(e => e).Count();

                List<InMemoryCommittedDomainEvent> committedDomainEvents;
                if (_eventStore.ContainsKey(id.Value))
                {
                    committedDomainEvents = _eventStore[id.Value];
                }
                else
                {
                    committedDomainEvents = new List<InMemoryCommittedDomainEvent>();
                    _eventStore[id.Value] = committedDomainEvents;
                }

                var newCommittedDomainEvents = serializedEvents
                    .Select((e, i) =>
                        {
                            var committedDomainEvent = new InMemoryCommittedDomainEvent
                                {
                                    AggregateId = id.Value,
                                    AggregateName = e.Metadata[MetadataKeys.AggregateName],
                                    AggregateSequenceNumber = e.AggregateSequenceNumber,
                                    Data = e.SerializedData,
                                    Metadata = e.SerializedMetadata,
                                    GlobalSequenceNumber = globalCount + i + 1,
                                };
                            _log.Verbose("Committing event {0}{1}", Environment.NewLine, committedDomainEvent.ToString());
                            return committedDomainEvent;
                        })
                    .ToList();

                var expectedVersion = newCommittedDomainEvents.First().AggregateSequenceNumber - 1;
                if (expectedVersion != committedDomainEvents.Count)
                {
                    throw new OptimisticConcurrencyException("");
                }

                committedDomainEvents.AddRange(newCommittedDomainEvents);

                return newCommittedDomainEvents;
            }
        }