コード例 #1
0
ファイル: QueryWrapper.cs プロジェクト: dementcore/Mediate
        internal async Task <TResult> Handle(IQuery <TResult> query, CancellationToken cancellationToken)
        {
            IQueryHandler <TQuery, TResult> handler = await _queryHandlerProvider.GetHandler <TQuery, TResult>();

            if (handler == null)
            {
                throw new InvalidOperationException($"There isn't any registered query handler for {typeof(TQuery).Name}");
            }

            IEnumerable <IQueryMiddleware <TQuery, TResult> > middlewares = await _queryMiddlewareProvider.GetMiddlewares <TQuery, TResult>();

            async Task <TResult> pipelineEnd()
            {
                return(await handler.Handle((TQuery)query, cancellationToken));
            }

            NextMiddlewareDelegate <TResult> pipeline = middlewares
                                                        .Reverse()
                                                        .Aggregate((NextMiddlewareDelegate <TResult>)pipelineEnd, (next, middleware) =>
            {
                return(async delegate
                {
                    return await middleware.Invoke((TQuery)query, cancellationToken, next);
                });
            });

            return(await pipeline());
        }
コード例 #2
0
ファイル: Mediator.cs プロジェクト: dementcore/Mediate
        /// <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();
        }
コード例 #3
0
        public async Task Invoke(TEvent @event, CancellationToken cancellationToken, NextMiddlewareDelegate next)
        {
            //example validation
            if (@event.EventId == Guid.Empty)
            {
                //example exception for this example
                throw new InvalidOperationException("The event id must be not null");
            }

            await next();
        }
コード例 #4
0
        public async Task <TResult> Invoke(TQuery query, CancellationToken cancellationToken, NextMiddlewareDelegate <TResult> next)
        {
            //example validation
            if (query.QueryId != Guid.Empty)
            {
                return(await next());
            }

            //example exception for this example
            throw new InvalidOperationException("The query id must be not null");
        }
コード例 #5
0
        public async Task Invoke(SampleComplexEvent @event, CancellationToken cancellationToken, NextMiddlewareDelegate next)
        {
            @event.EventData += " [modified from middleware]";

            await next();
        }
コード例 #6
0
        public async Task <SampleComplexQueryResponse> Invoke(SampleComplexQuery query, CancellationToken cancellationToken, NextMiddlewareDelegate <SampleComplexQueryResponse> next)
        {
            query.QueryData += " I'm using Mediate";

            SampleComplexQueryResponse response = await next();

            response.QueryResponseData += " [modified from middleware]";

            return(response);
        }