Beispiel #1
0
        /// <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();
        }
Beispiel #2
0
        public async Task Raise(IDomainEvent @event)
        {
            var handlers = _provider.GetHandlers(@event.GetType());

            foreach (var handler in handlers)
            {
                await handler.Handle(@event);
            }
        }