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); } }); }
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); }