Example #1
0
        private void PublishEntityEvents(EntityEventReport changeReport)
        {
            foreach (var localEvent in changeReport.DomainEvents)
            {
                UnitOfWorkManager.Current?.AddOrReplaceLocalEvent(
                    new UnitOfWorkEventRecord(localEvent.EventData.GetType(), localEvent.EventData, localEvent.EventOrder)
                    );
            }

            foreach (var distributedEvent in changeReport.DistributedEvents)
            {
                UnitOfWorkManager.Current?.AddOrReplaceDistributedEvent(
                    new UnitOfWorkEventRecord(distributedEvent.EventData.GetType(), distributedEvent.EventData, distributedEvent.EventOrder)
                    );
            }
        }
Example #2
0
        protected virtual EntityEventReport CreateEventReport()
        {
            var eventReport = new EntityEventReport();

            foreach (var entry in ChangeTracker.Entries().ToList())
            {
                var generatesDomainEventsEntity = entry.Entity as IGeneratesDomainEvents;
                if (generatesDomainEventsEntity == null)
                {
                    continue;
                }

                var localEvents = generatesDomainEventsEntity.GetLocalEvents()?.ToArray();
                if (localEvents != null && localEvents.Any())
                {
                    eventReport.DomainEvents.AddRange(
                        localEvents.Select(
                            eventRecord => new DomainEventEntry(
                                entry.Entity,
                                eventRecord.EventData,
                                eventRecord.EventOrder
                                )
                            )
                        );
                    generatesDomainEventsEntity.ClearLocalEvents();
                }

                var distributedEvents = generatesDomainEventsEntity.GetDistributedEvents()?.ToArray();
                if (distributedEvents != null && distributedEvents.Any())
                {
                    eventReport.DistributedEvents.AddRange(
                        distributedEvents.Select(
                            eventRecord => new DomainEventEntry(
                                entry.Entity,
                                eventRecord.EventData,
                                eventRecord.EventOrder)
                            )
                        );
                    generatesDomainEventsEntity.ClearDistributedEvents();
                }
            }

            return(eventReport);
        }