public virtual async Task <IReadOnlyCollection <IDomainEvent> > StoreAsync <TAggregate>(string id, IReadOnlyCollection <IUncommittedEvent> uncommittedDomainEvents, CancellationToken cancellationToken) where TAggregate : IAggregateRoot { var aggregateType = typeof(TAggregate); Log.Verbose( "Storing {0} events for aggregate '{1}' with ID '{2}'", uncommittedDomainEvents.Count, aggregateType.Name, id); var serializedEvents = uncommittedDomainEvents .Select(e => { var metadata = MetadataProviders .SelectMany(p => p.ProvideMetadata <TAggregate>(id, e.AggregateEvent, e.Metadata)) .Concat(e.Metadata); return(EventJsonSerializer.Serialize(e.AggregateEvent, metadata)); }) .ToList(); var committedDomainEvents = await CommitEventsAsync <TAggregate>( id, serializedEvents, cancellationToken) .ConfigureAwait(false); var domainEvents = committedDomainEvents.Select(EventJsonSerializer.Deserialize).ToList(); return(domainEvents); }
public virtual async Task <IReadOnlyCollection <IDomainEvent <TAggregate, TIdentity> > > StoreAsync <TAggregate, TIdentity>( TIdentity id, IReadOnlyCollection <IUncommittedEvent> uncommittedDomainEvents, CancellationToken cancellationToken) where TAggregate : IAggregateRoot <TIdentity> where TIdentity : IIdentity { if (!uncommittedDomainEvents.Any()) { return(new IDomainEvent <TAggregate, TIdentity>[] {}); } var aggregateType = typeof(TAggregate); Log.Verbose( "Storing {0} events for aggregate '{1}' with ID '{2}'", uncommittedDomainEvents.Count, aggregateType.Name, id); var batchId = Guid.NewGuid().ToString(); var storeMetadata = new[] { new KeyValuePair <string, string>(MetadataKeys.BatchId, batchId), }; var serializedEvents = uncommittedDomainEvents .Select(e => { var metadata = MetadataProviders .SelectMany(p => p.ProvideMetadata <TAggregate, TIdentity>(id, e.AggregateEvent, e.Metadata)) .Concat(e.Metadata) .Concat(storeMetadata); return(EventJsonSerializer.Serialize(e.AggregateEvent, metadata)); }) .ToList(); var committedDomainEvents = await CommitEventsAsync <TAggregate, TIdentity>( id, serializedEvents, cancellationToken) .ConfigureAwait(false); var domainEvents = committedDomainEvents .Select(e => EventJsonSerializer.Deserialize <TAggregate, TIdentity>(id, e)) .ToList(); return(domainEvents); }