You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例来解析字段,因无法获取实例导致解析失败。

解决方案
  1. 将Query类注册到DI容器,确保GraphQL能获取其实例
  2. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:03:17