public void Handle(IEventProvider eventProvider, params IProjectionContext[] projectionContexts) { // get projection var projection = _projectionFactory.GetProjection(eventProvider); // project projectionContexts.ForEach(projection.Project); }
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); } } }