Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        public virtual async Task <IReadOnlyCollection <IDomainEvent <TAggregate, TIdentity> > > LoadEventsAsync <TAggregate, TIdentity>(
            TIdentity id,
            CancellationToken cancellationToken)
            where TAggregate : IAggregateRoot <TIdentity>
            where TIdentity : IIdentity
        {
            var committedDomainEvents = await LoadCommittedEventsAsync <TAggregate, TIdentity>(id, cancellationToken).ConfigureAwait(false);

            var domainEvents = (IReadOnlyCollection <IDomainEvent <TAggregate, TIdentity> >)committedDomainEvents
                               .Select(e => EventJsonSerializer.Deserialize <TAggregate, TIdentity>(id, e))
                               .ToList();

            if (!domainEvents.Any())
            {
                return(domainEvents);
            }

            domainEvents = EventUpgradeManager.Upgrade(domainEvents);

            return(domainEvents);
        }
Esempio n. 4
0
        public async Task <AllEventsPage> LoadAllEventsAsync(
            GlobalPosition globalPosition,
            int pageSize,
            CancellationToken cancellationToken)
        {
            if (pageSize <= 0)
            {
                throw new ArgumentOutOfRangeException("pageSize");
            }

            var allCommittedEventsPage = await LoadAllCommittedDomainEvents(
                globalPosition,
                pageSize,
                cancellationToken)
                                         .ConfigureAwait(false);

            var domainEvents = (IReadOnlyCollection <IDomainEvent>)allCommittedEventsPage.CommittedDomainEvents
                               .Select(e => EventJsonSerializer.Deserialize(e))
                               .ToList();

            domainEvents = EventUpgradeManager.Upgrade(domainEvents);
            return(new AllEventsPage(allCommittedEventsPage.NextGlobalPosition, domainEvents));
        }