Пример #1
0
        private async Task ExecutePipeline <TRequest, TResponse>(Type[] pipes, QueryPipelineContext <TRequest, TResponse> queryPipelineContext) where TRequest : IQuery <TResponse>
        {
            if (pipes.Any() == false)
            {
                return;
            }

            var pipeType = pipes.First();
            var pipeObj  = _serviceProvider.GetRequiredService(pipeType) as IQueryPipe <TRequest, TResponse>;

            if (pipeObj == null)
            {
                throw new InvalidOperationException($"{pipeType.FullName} is not a valid IPipe");
            }

            await pipeObj.Handle(queryPipelineContext, async (p2) =>
            {
                if (pipes.Length > 1)
                {
                    await ExecutePipeline(pipes.Skip(1).ToArray(), p2);
                }
            });
        }
Пример #2
0
        public async Task <TResponse> ExecuteQuery <TRequest, TResponse, TPipeContext>(TRequest request) where TRequest : IQuery <TResponse>
        {
            if (_serviceProvider.GetService(typeof(IQueryHandler <TRequest, TResponse>)) is IQueryHandler <TRequest, TResponse> handler)
            {
                return(await handler.Handle(request));
            }

            var pipeContext = new QueryPipelineContext <TRequest, TResponse, TPipeContext>(request);
            var builder     = new QueryPipelineBuilder <TRequest, TResponse, TPipeContext>();

            var pipeline = _serviceProvider.GetRequiredService(typeof(IQueryPipeline <TRequest, TResponse, TPipeContext>)) as IQueryPipeline <TRequest, TResponse, TPipeContext>;

            if (pipeline == null)
            {
                throw new InvalidOperationException($"Pipeline does not exist for {request.GetType().FullName}");
            }

            pipeline.Configure(builder);

            await ExecutePipeline(builder.GetPipes(), pipeContext);

            return(pipeContext.Response);
        }