0

我正在构建一个 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; }
}

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

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 属性?

4

1 回答 1

1

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

    Field<EmployeeType>(
        "manager",
        resolve: context =>
        {
            int id = context.Source.ManagerId;
            return GetEmployeeById(id);
        });
于 2019-10-09T15:11:31.417 回答