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