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); }
private static Task PerformCoordinatedReconcileAsync( EventCentricAggregateRoot aggregate, IAggregateReconciliationProxy proxy, CancellationToken?cancellationToken) { return(proxy.OverwriteAsync(aggregate, cancellationToken: cancellationToken)); }
private Task ReconcileAsync( EventCentricAggregateRoot aggregate, IAggregateReconciliationProxy proxy, CancellationToken?cancellationToken) { return(aggregate.CoordinateAsync( () => PerformCoordinatedReconcileAsync(aggregate, proxy, cancellationToken), cancellationToken: cancellationToken, timeout: timeout)); }
private Task ReconcileAsync( Reference aggregate, IEnumerable <DomainEvent> events, IAggregateReconciliationProxy proxy, CancellationToken?cancellationToken) { return(aggregate.CoordinateAsync( () => PerformCoordinatedReconcileAsync(aggregate, events, proxy, cancellationToken), cancellationToken: cancellationToken, timeout: timeout)); }
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); } } }