Пример #1
0
        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);
        }
Пример #2
0
        public Task OnCommitFailedAsync()
        {
            allUsedProjectors.Clear();
            eventProjectionOptions = null;

            return(Task.CompletedTask);
        }
Пример #3
0
        protected override async Task CommitUsedProjectorsAsync(IReadOnlyCollection <IEntityEventProjector> usedProjectors, EventProjectionOptions options)
        {
            eventProjectionOptions = options;

            foreach (var projector in usedProjectors)
            {
                allUsedProjectors.Add(projector);
            }

            await transactionCoordinator.Value.CommitAsync();
        }
Пример #4
0
        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);
        }
Пример #5
0
        protected override async Task CommitUsedProjectorsAsync(IReadOnlyCollection <IEntityEventProjector> usedProjectors, EventProjectionOptions options)
        {
            await base.CommitUsedProjectorsAsync(usedProjectors, options);

            await crudRepository.SaveChangesAsync();
        }
Пример #6
0
 protected override IEnumerable <IEntityEventProjector> GetProjectors(Type entityType, EventProjectionOptions options)
 {
     return(serviceLocator.GetAll(
                typeof(IEF6EntityEventProjector <>).MakeGenericType(entityType))
            .Cast <IEntityEventProjector>());
 }
Пример #7
0
        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));
            }
        }
Пример #8
0
 protected virtual async Task CommitUsedProjectorsAsync(IReadOnlyCollection <IEntityEventProjector> usedProjectors, EventProjectionOptions options)
 {
     foreach (var projector in usedProjectors)
     {
         await projector.CommitChangesAsync();
     }
 }
Пример #9
0
 protected abstract IEnumerable <IEntityEventProjector> GetProjectors(Type entityType, EventProjectionOptions options);