コード例 #1
0
        private async Task PerformCoordinatedReconcileAsync(
            Reference aggregate,
            IEnumerable <DomainEvent> events,
            IAggregateReconciliationProxy proxy,
            CancellationToken?cancellationToken)
        {
            EventCentricAggregateRoot?existing = await proxy
                                                 .GetAsync(aggregate, cancellationToken : cancellationToken)
                                                 .ConfigureAwait(false);

            if (existing is null)
            {
                existing = await factory
                           .CreateAsync(aggregate, cancellationToken : cancellationToken)
                           .ConfigureAwait(false);
            }
            else if (ignorePreviousVersions)
            {
                events = RemovePreviousVersions(events, existing.Version);
            }

            await
            ApplyAsync(
                existing,
                events,
                proxy,
                aggregate,
                cancellationToken : cancellationToken)
            .ConfigureAwait(false);
        }
コード例 #2
0
 private static Task PerformCoordinatedReconcileAsync(
     EventCentricAggregateRoot aggregate,
     IAggregateReconciliationProxy proxy,
     CancellationToken?cancellationToken)
 {
     return(proxy.OverwriteAsync(aggregate, cancellationToken: cancellationToken));
 }
コード例 #3
0
 private Task ReconcileAsync(
     EventCentricAggregateRoot aggregate,
     IAggregateReconciliationProxy proxy,
     CancellationToken?cancellationToken)
 {
     return(aggregate.CoordinateAsync(
                () => PerformCoordinatedReconcileAsync(aggregate, proxy, cancellationToken),
                cancellationToken: cancellationToken,
                timeout: timeout));
 }
コード例 #4
0
 private Task ReconcileAsync(
     Reference aggregate,
     IEnumerable <DomainEvent> events,
     IAggregateReconciliationProxy proxy,
     CancellationToken?cancellationToken)
 {
     return(aggregate.CoordinateAsync(
                () => PerformCoordinatedReconcileAsync(aggregate, events, proxy, cancellationToken),
                cancellationToken: cancellationToken,
                timeout: timeout));
 }
コード例 #5
0
        protected virtual async Task ApplyAsync(
            EventCentricAggregateRoot aggregate,
            IEnumerable <DomainEvent> events,
            IAggregateReconciliationProxy proxy,
            Reference reference,
            CancellationToken?cancellationToken = default)
        {
            if (events.Any())
            {
                try
                {
                    aggregate.LoadFromHistory(events);

                    await proxy
                    .SaveAsync(aggregate, cancellationToken : cancellationToken)
                    .ConfigureAwait(false);

                    await OnAggregateReconciledAsync(reference, events, cancellationToken : cancellationToken)
                    .ConfigureAwait(false);
                }
                catch (AggregateHistoryInvalidForStateException invalid)
                {
                    await
                    OnAggregateConflictDetectedAsync(
                        invalid.Aggregate,
                        events,
                        invalid.StartingVersion,
                        invalid.Aggregate.Version,
                        cancellationToken : cancellationToken)
                    .ConfigureAwait(false);
                }
                catch (AggregateConflictDetectedException conflict)
                {
                    await
                    OnAggregateConflictDetectedAsync(
                        reference,
                        events,
                        conflict.Received,
                        conflict.Persisted,
                        cancellationToken : cancellationToken)
                    .ConfigureAwait(false);
                }
            }
        }