Schema First模式下.NET GraphQL查询无法解析的MVE问题
问题描述
运行环境为ASP.NET Core 7.0及GraphQL 7.6.1,尝试构建Schema First模式的GraphQL.NET最小可行示例时,查询在控制台可正常解析,但API中始终报错:Error trying to resolve field 'user',怀疑是依赖注入(DI)配置问题。
相关代码如下:
Schema 文件(schema.gql)
type Query { user: User } type User { id: String! name: String! }
User.cs
public class User { public string Id { get; set; } = string.Empty; public string Name { get; set; } = string.Empty; } public class Query { [GraphQLMetadata("user")] public User GetUser() { return new User { Id = "1", Name = "Simpleton" }; } }
原Program.cs
// Get the schema information FileInfo fileInfo = new(Path.Join(AppContext.BaseDirectory, "schema.gql")); var schemaText = await GetSchema(fileInfo); var schema = Schema.For(schemaText, sb => { sb.Types.Include<Query>(); }); var builder = WebApplication.CreateBuilder(args); builder.Services.AddGraphQL(b => b .AddSchema(schema) // schema .AddSystemTextJson()); // serializer builder.Services.AddSingleton<IDataService, DataService>(); builder.Services.AddLogging(b => b.AddConsole()); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseGraphQLPlayground(); } app.UseGraphQL("/graphql"); // url to host GraphQL endpoint await app.RunAsync();
问题原因
原代码中Schema实例在DI容器构建前就已创建,此时Schema无法访问ASP.NET Core的DI容器,且Query类未注册到DI中。GraphQL在API运行时需要从DI获取Query实例来解析字段,因无法获取实例导致解析失败。
解决方案
- 将
Query类注册到DI容器,确保GraphQL能获取其实例 - 调整Schema的创建方式,让DI参与Schema的初始化过程,确保Schema能访问DI服务
修改后的Program.cs
var builder = WebApplication.CreateBuilder(args); // 注册Query到DI容器 builder.Services.AddScoped<Query>(); // 读取Schema文本 var schemaPath = Path.Join(AppContext.BaseDirectory, "schema.gql"); var schemaText = await File.ReadAllTextAsync(schemaPath); // 通过工厂方法注册Schema,确保能获取到DI服务提供器 builder.Services.AddGraphQL(b => b .AddSystemTextJson() .AddSchema(sp => Schema.For(schemaText, sb => { sb.Types.Include<Query>(); sb.Services = sp; })) ); builder.Services.AddSingleton<IDataService, DataService>(); builder.Services.AddLogging(b => b.AddConsole()); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseGraphQLPlayground(); } app.UseGraphQL("/graphql"); await app.RunAsync();
说明
修改后,GraphQL在解析user字段时,能从DI容器获取Query实例,正确调用GetUser方法返回数据,解决解析失败问题。
内容的提问来源于stack exchange,提问作者John Ervin
相关产品推荐
相关产品推荐

