Pull to refresh

Comments 12

Мне понравилась библиотека HotChocolate, достаточно удобное API, но скудная документация, зато разрабатывается достаточно активно.

Ух ты, спасибо, как-то не нашел. Там правда в январе этого года первый коммит, молодая библиотека.

А как у HotChocolate с DataLoader и проблемой N + 1? Я вот о чем:


query {
  posts {
    author {
      name
    }
  }
}

В ресолвере поля posts мы достаем список постов. А в ресолвере поля author мы полезем в базу N раз.


В референсной реализации GraphQL используется подход DataLoader. Он основан на том, что если у нас есть операция получения списка объектов :


Task<Item[]> GetItems(int id[]);

То мы можем группировать вызовы, загружающие единичный объект Item:


  • сначала Task-и на получение единичного элемента накапливаются в очереди
  • затем происходит обращение к БД для загрузки списка элементов
  • далее, разультаты запроса распределяются по ожидающим Task из очереди
  • и наконец, выполнение переходит к более глубокому уровню GraphQL-ресолверов.

При всей уродливости graphql-dotnet, DataLoader там есть.

Пока настолько глубоко не погружался в эту тему, но похоже поддержка DataLoader там тоже есть, как раз недавно была добавлена.
Простите, а зачем так жёстко-то, с ручной сборкой resolvers? Вроде бы, примеров на graphql-dotnet.github.io/getting-started хватает, чтобы делать классы-наследники ObjectGraphType и определять поля в их конструкторе.
Я не то, чтобы гуру GraphQL, но тоже копаюсь с ним сейчас, и мне интересно.

Когда делаешь классы наследники ObjectGraphType подразумевается, что вся схема известна на этапе компиляции. Здесь я генерирую схему на основе динамических метаданных Docsvision.

Тогда вы правы. Возможно, тогда Conventions помогли бы что-то упростить. Документация там тоже неважная, конечно.

Хочется в ближайшем будущем попробовать GraphQL, а именно идею его использования как api-gateway, чтобы на клиенте любые данные извлекать одним запросом. Интересно как сделать маппинг с наименьшими усилиями.

Главное, чтобы в Вашем API были нормальные сигнатуры функций. То есть, возвращаемое значение — модель, а не ActionResult какой-нибудь. Тогда можно рефлекшеном пробежаться и сгенерировать схему как в статье.

А вы используете директивы в своем проекте? Что-то в graphql-dotnet намудрили с ними, и свои директивы непонятно как реализовывать. В apolloserver директивы очень просто добавляются

Не, пока не пробовали.

В HotChocolate есть поддержка директив, правда сейчас разработка ещё в процессе, но в целом уже работает, и можно использовать.
Sign up to leave a comment.