/// <summary> /// Dispatchs an event into configured dispatch strategy /// </summary> /// <typeparam name="TEvent">Event type</typeparam> /// <param name="event">Event data</param> /// <param name="cancellationToken">Cancellation token</param> /// <returns></returns> public async Task Dispatch <TEvent>(TEvent @event, CancellationToken cancellationToken) where TEvent : IEvent { if (@event == null) { throw new ArgumentNullException(nameof(@event)); } IEnumerable <IEventHandler <TEvent> > handlers = await _eventHandlerProvider.GetHandlers <TEvent>(); if (!handlers.Any()) { throw new InvalidOperationException($"There isn't any registered event handler for {typeof(TEvent).Name}"); } IEnumerable <IEventMiddleware <TEvent> > middlewares = await _eventMiddlewareProvider.GetMiddlewares <TEvent>(); async Task pipelineEnd() { await _eventDispatchStrategy.Dispatch(@event, handlers, cancellationToken); } NextMiddlewareDelegate pipeline = middlewares .Reverse() .Aggregate((NextMiddlewareDelegate)pipelineEnd, (next, middleware) => { return(async delegate { await middleware.Invoke(@event, cancellationToken, next); }); }); await pipeline(); }
public async Task Raise(IDomainEvent @event) { var handlers = _provider.GetHandlers(@event.GetType()); foreach (var handler in handlers) { await handler.Handle(@event); } }