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); } }
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; } }