在 GraphQL.NET 中构建分层对象树

Build hierarchical object tree in GraphQL.NET

我正在构建一个 API,它允许您在 GraphQL 中获取分层对象树。这些对象不在数据存储中,而是来自某个上游 API。例如;

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public int ManagerId { get; set; }
}

我想用引用经理的实际 Employee 对象替换 ManagerId 属性。我已经走到这一步了;

class EmployeeType : ObjectGraphType<Employee>
{
    Field(x => x.Id);
    Field(x => x.FirstName);
    Field(x => x.Surname);

    Field<EmployeeType>(
        "manager",
        arguments: new QueryArguments(new QueryArgument<IdGraphType> { Name = "id" }),
        resolve: context =>
        {
            int id = context.GetArgument<int>("id");
            return GetEmployeeById(id);
        });
}

想法是有一个自定义的管理器解析器,可以从 API 中获取它。问题是调用此 API 的人需要显式传入 ID,如下所示;

POST /employees
{
  Employee(id: 1234) {
    id,
    firstName,
    lastName,
    manager(id: 5432) {
      firstName,
      lastName
    }
  }
}

这行不通,因为他们首先需要知道经理的 ID 是什么,然后才能执行此查询。我如何分阶段执行此 GraphQL 查询,首先获取员工对象,然后在知道他或她的 ID 后获取经理对象?此外,我如何将父级的上下文传递给解析器,以便它可以获取 ID 属性?

我找到答案了!我可以使用 Source 属性 获取父项。现在我不需要在解析器中为 EmployeeType 指定任何参数;我只能这样做:

    Field<EmployeeType>(
        "manager",
        resolve: context =>
        {
            int id = context.Source.ManagerId;
            return GetEmployeeById(id);
        });