public virtual async Task ExecuteProjectionsAsync(IReadOnlyCollection <IEventMessage <DomainAggregateEvent> > events, IUnitOfWork unitOfWork, EventProjectionOptions options) { var usedProjectors = new HashSet <IEntityEventProjector>(); var aggregateEvents = events.GroupBy(x => x.Event.AggregateId); foreach (var entityEvents in aggregateEvents) { Guid classId = entityEvents.First().Metadata.GetAggregateClassId() ?? throw new InvalidOperationException($"Cannot create projection for aggregate ID {entityEvents.Key} because event metadata don't contain aggregate class ID"); Type entityType = entityTypeManager.GetClassInfoByClassId(classId).ClrType; Guid aggregateId = entityEvents.Key; IEnumerable <IEntityEventProjector> projectors = GetProjectors(entityType, options); foreach (var projector in projectors) { if (projector is IEventPublishingEntityEventProjector publishingProjector) { publishingProjector.EventBuffer = unitOfWork?.EventBuffer; publishingProjector.EventMessageFactory = eventMessageFactory; } await projector.ProjectEventsAsync(aggregateId, entityEvents.ToArray()); usedProjectors.Add(projector); } } await CommitUsedProjectorsAsync(usedProjectors, options); }
public Task OnCommitFailedAsync() { allUsedProjectors.Clear(); eventProjectionOptions = null; return(Task.CompletedTask); }
protected override async Task CommitUsedProjectorsAsync(IReadOnlyCollection <IEntityEventProjector> usedProjectors, EventProjectionOptions options) { eventProjectionOptions = options; foreach (var projector in usedProjectors) { allUsedProjectors.Add(projector); } await transactionCoordinator.Value.CommitAsync(); }
public override async Task ExecuteProjectionsAsync( IReadOnlyCollection <IEventMessage <DomainAggregateEvent> > events, IUnitOfWork unitOfWork, EventProjectionOptions options) { if (!transactionParticipantRegistered) { transactionParticipantRegistered = true; transactionCoordinator.Value.AddTransactionParticipant(this); } await base.ExecuteProjectionsAsync(events, unitOfWork, options); }
protected override async Task CommitUsedProjectorsAsync(IReadOnlyCollection <IEntityEventProjector> usedProjectors, EventProjectionOptions options) { await base.CommitUsedProjectorsAsync(usedProjectors, options); await crudRepository.SaveChangesAsync(); }
protected override IEnumerable <IEntityEventProjector> GetProjectors(Type entityType, EventProjectionOptions options) { return(serviceLocator.GetAll( typeof(IEF6EntityEventProjector <>).MakeGenericType(entityType)) .Cast <IEntityEventProjector>()); }
protected override IEnumerable <IEntityEventProjector> GetProjectors(Type entityType, EventProjectionOptions options) { var efCoreOptions = options as EFCoreEventProjectionOptions; if (efCoreOptions == null || efCoreOptions.IsSynchronousProjection == false) { return(projectorResolver.GetProjectors(entityType)); } else { return(projectorResolver.GetSyncProjectors(entityType)); } }
protected virtual async Task CommitUsedProjectorsAsync(IReadOnlyCollection <IEntityEventProjector> usedProjectors, EventProjectionOptions options) { foreach (var projector in usedProjectors) { await projector.CommitChangesAsync(); } }
protected abstract IEnumerable <IEntityEventProjector> GetProjectors(Type entityType, EventProjectionOptions options);