private void Register <TEvent>(Type eventStreamHandlerType, Func <long, TEvent, CancellationToken, Task> eventHandlerMethodInvocation) where TEvent : class, IEvent { if (!_projectionBuildersByEventType.TryGetValue(eventStreamHandlerType, out var projectionBuildersForEventStreamHandler)) { projectionBuildersForEventStreamHandler = new ProjectionBuildersByEventType(); _projectionBuildersByEventType.TryAdd(eventStreamHandlerType, projectionBuildersForEventStreamHandler); } if (!projectionBuildersForEventStreamHandler.TryGetValue(typeof(TEvent), out var projectionBuildersForEvent)) { projectionBuildersForEvent = new List <Func <long, IEvent, CancellationToken, Task> >(); projectionBuildersForEventStreamHandler.Add(typeof(TEvent), projectionBuildersForEvent); } projectionBuildersForEvent.Add((streamPosition, @event, stoppingToken) => eventHandlerMethodInvocation(streamPosition, (TEvent)@event, stoppingToken)); }
public EventHandler(ILogger <EventHandler <TEventStream> > logger, IProjectionStore <Projections.EventHandlerState.Projection> eventHandlerStateStore, IProjectionBuilderRegistrar projectionBuilderRegistrar) { _logger = logger; _eventHandlerStateStore = eventHandlerStateStore; _projectionBuildersByEventType = projectionBuilderRegistrar.Get(typeof(TEventStream)); }