public void Handle(IEventProvider eventProvider, params IProjectionContext[] projectionContexts)
        {
            // get projection
            var projection = _projectionFactory.GetProjection(eventProvider);

            // project
            projectionContexts.ForEach(projection.Project);
        }
Esempio n. 2
0
        public async Task ProcessBatchAsync(
            IEnumerable <IEvent> batch,
            CancellationToken cancellationToken)
        {
            var groupedEvents = batch
                                .Where(e => filters.Any(f => f.Evaluate(e.Metadata.StreamId)))
                                .GroupBy(e => e.Metadata.StreamId)
                                .ToArray();

            diagnostics.ProcessingGroupedEvents(projectionName, groupedEvents, batch);

            foreach (var events in groupedEvents)
            {
                var operation = diagnostics.StartStreamProjection(projectionName, events.Key);
                try
                {
                    if (!projectionMetadata.CanConsumeOneOrMoreEvents(events))
                    {
                        // Skip if projection is not consuming any of the events.
                        operation.ProjectionSkipped(events);
                        continue;
                    }

                    var projection = projectionFactory
                                     .GetProjection <TProjection>();

                    await projection
                    .InitializeAsync(
                        events.Key,
                        cancellationToken)
                    .ConfigureAwait(false);

                    await projectionMetadata
                    .ConsumeEventsAsync(events, projection, cancellationToken)
                    .ConfigureAwait(false);

                    await projection
                    .CompleteAsync(cancellationToken)
                    .ConfigureAwait(false);

                    operation.ProjectionCompleted(events);
                }
                catch (Exception ex)
                {
                    operation.ProjectionFailed(events, ex);
                }
            }
        }