Построить иерархическое дерево объектов в GraphQL.NET - PullRequest
0 голосов
/ 09 октября 2019

Я создаю 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, необходимо явно передать идентификатор, например, так:

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

Это не работает, потому что ему сначала нужно знать, что такое идентификатор менеджера, прежде чем он сможет это сделать. выполнить этот запрос. Как я могу выполнить этот запрос GraphQL поэтапно, где я сначала получаю объект сотрудника, а затем извлекаю объект менеджера, как только я знаю его или ее идентификатор? Кроме того, как передать контекст родителя в распознаватель, чтобы он мог получить свойство ID?

1 Ответ

1 голос
/ 09 октября 2019

Я нашел ответ! Я могу завладеть родителем, используя свойство Source. Теперь мне не нужно указывать аргументы для EmployeeType в распознавателе;Я могу просто сделать это:

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