graphql-dotnet如何在代码中不通过HTTP层直接调用GraphQL查询
你想要的直接通过查询语句生成执行上下文的需求可以通过GraphQL.NET内置的IDocumentExecuter实现,完全不需要手动构造ResolveFieldContext,具体实现方式如下:
你已经配置好包含所有自定义GraphType、BatchLoader规则的Schema实例以及依赖注入容器的情况下,直接调用执行器的ExecuteAsync方法即可,示例代码:
var executionResult = await _documentExecuter.ExecuteAsync(options => { // 传入你已经完成配置的Schema实例 options.Schema = yourConfiguredSchema; // 直接写你要执行的查询语句,支持所有GraphQL原生语法 options.Query = "query test { getTickets(id: 1) { number, title } }"; // 若有动态参数可通过Variables传入 // options.Variables = new Inputs(new Dictionary<string, object> {{"id", 1}}); // 传入服务提供者,保证BatchLoader和字段解析器的依赖注入正常工作 options.RequestServices = yourServiceProvider; // 可选:传入用户上下文、取消令牌等自定义配置 }); // 处理执行结果 if (executionResult.Errors != null && executionResult.Errors.Count > 0) { // 自行处理执行错误逻辑 } // 直接获取返回数据,结构和HTTP接口返回的data结构完全一致 var resultData = executionResult.Data;
这种方案的优势非常贴合你的使用场景:
- 所有执行逻辑和走HTTP层调用完全一致,你之前在GraphType中配置的BatchLoader规则会完全生效,不需要做额外适配
- 不需要手动处理
ResolveFieldContext的字段、参数、上下文填充,所有逻辑由官方执行器自动完成,避免手动构造上下文出错 - 天然支持多字段查询、嵌套查询等复杂查询语句,不管你要访问多少个字段都可以直接通过生成查询字符串的方式实现
如果你需要更简化的调用方式,可以自行封装辅助方法,将Schema、服务提供者等固定参数提前注入,使用时只需要传入查询语句和变量即可,和你设想的调用方式体验一致:
// 封装后的辅助方法示例 public async Task<T> ExecuteInternalQueryAsync<T>(string query, Dictionary<string, object> variables = null) { var execResult = await _documentExecuter.ExecuteAsync(opt => { opt.Schema = _schema; opt.Query = query; opt.Variables = variables == null ? null : new Inputs(variables); opt.RequestServices = _serviceProvider; }); if (execResult.Errors?.Any() == true) { throw new ApplicationException($"内部查询执行失败:{string.Join(";", execResult.Errors.Select(e => e.Message))}"); } // 可根据需要自行做序列化反序列化转换为指定类型 return JsonSerializer.Deserialize<T>(JsonSerializer.Serialize(execResult.Data)); }
内容的提问来源于stack exchange,提问作者slxSlashi
相关产品推荐
相关产品推荐

