Как сначала организовать более нескольких мутаций в GraphQL .Net GraphType?

#graphql #graphql-dotnet #graphql.net

#graphql #graphql-dotnet #graphql.net

Вопрос:

В GraphQL .Net большая часть кода примера содержит один объект графика мутаций верхнего уровня, в котором определено много фактических мутаций.
Вот пример со страницы мутаций GraphQL .NET:

 public class StarWarsSchema : Schema
{
  public StarWarsSchema(IServiceProvider provider)
    : base(provider)
  {
    Query = provider.Resolve<StarWarsQuery>();
    Mutation = provider.Resolve<StarWarsMutation>();
  }
}


public class StarWarsMutation : ObjectGraphType
{
  public StarWarsMutation(StarWarsData data)
  {
    Field<HumanType>(
      "createHuman",
      arguments: new QueryArguments(
        new QueryArgument<NonNullGraphType<HumanInputType>> {Name = "human"}
      ),
      resolve: context =>
      {
        var human = context.GetArgument<Human>("human");
        return data.AddHuman(human);
      });
  }
}
  

И это кажется нормальным, когда у вас 1-5 мутаций, но со временем в некоторых более крупных проектах можно получить десятки мутаций. Для работы кажется достаточным объединить их в один большой класс, хотя также кажется, что не хватает некоторой организации. Я попытался поместить дочернюю мутацию GraphTypeObject в поле родительской мутации, но у меня возникли небольшие проблемы с вызовом субмутации. Возможно, я неправильно настроил его.

Это просто заставляет меня задуматься, конечно, должен быть пользователь с более чем дюжиной мутаций, который мог бы организовать свои мутации, не помещая все свои мутации в один объект мутаций верхнего уровня.

Как сначала организовать более нескольких мутаций в GraphQL .Net GraphType?

Ответ №1:

https://graphql-dotnet.github.io/docs/getting-started/query-organization

Вы можете «группировать» запросы или мутации вместе, добавляя поле верхнего уровня. «Хитрость» заключается в возврате пустого объекта в распознавателе.

 public class StarWarsSchema : Schema
{
  public StarWarsSchema(IServiceProvider provider)
    : base(provider)
  {
    Query = provider.Resolve<StarWarsQuery>();
    Mutation = provider.Resolve<StarWarsMutation>();
  }
}

public class StarWarsMutation : ObjectGraphType
{
  public StarWarsMutation(StarWarsData data)
  {
    Field<CharacterMutation>(
      "characters",
      resolve: context => new { });
  }
}

public class CharacterMutation : ObjectGraphType
{
  public CharacterMutation(StarWarsData data)
  {
    Field<HumanType>(
      "createHuman",
      arguments: new QueryArguments(
        new QueryArgument<NonNullGraphType<HumanInputType>> {Name = "human"}
      ),
      resolve: context =>
      {
        var human = context.GetArgument<Human>("human");
        return data.AddHuman(human);
      });
  }
}
  

Эта организация отражается в том, как вызываются мутации (или запросы). Если вы просто хотите, чтобы они отображались извне в виде плоского списка (что было бы равно одному гигантскому файлу), вы также можете разбить его на столько файлов, сколько захотите, используя частичные классы.

Комментарии:

1. Спасибо, это было именно то, что я искал.