Типы входных данных объединения GraphQL

#graphql #hotchocolate

Вопрос:

В HotChocolate у меня есть тип запроса примерно такой

 // QueryType.cs
public Task<ContentCategory> FilterContentAsync(string categoryCode, ICollection<Filter> filters, CancellationToken cancellationToken = default)
            => ...;

// Filter.cs
public abstract class Filter
{
    public string Type { get;set; }
}

// BooleanFilter.cs
public class BooleanFilter : Filter
{
    public bool IsTrue { get; set; }
}

// NumberRangeFilter.cs
public class NumberRangeFilter : Filter
{
    public int Min { get; set; }

    public int Max { get; set; }
}

 

когда я запускаю приложение, я получаю следующую ошибку

1. Unable to infer or resolve a schema type from the type reference `Input: Filter`.

Поддерживается ли следующий запрос:

 filterContent (categoryCode: "All", filters: [{type: "boolean", isTrue: true}, {type: "numberrange", min: 10, max: 60}]) {
  id
}

 

Ответ №1:

Похоже, что в настоящее время это не реализовано.

Вот проблема в репозитории hotchocolate. В настоящее время (июль 2021 года) он открыт и имеет ярлык «невыполненная работа», поэтому я могу предположить, что объединения ввода еще не реализованы.

А вот твит одного из разработчиков hotChocolate, где он говорит

Мы реализуем специальное предложение #graphql oneof для горячего шоколада 12… пусть приходят входные союзы 🙂

Кстати, есть еще одна ссылка на обсуждение возможных реализаций проблемы объединения входных данных. Таким образом, в соответствии с этим, существует 7 различных идей о том, как изменить спецификацию, 1 победитель (7-й вариант) и ни одной ссылки на возможные реализации.

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

1. Продолжение. Команда HC говорит, что пока они не будут реализовывать эту функцию, потому что это решение не входит в спецификацию. Но у меня есть идея, как реализовать это самостоятельно. Короче говоря, используйте метод переопределения синтаксического анализа в классе InputObjectType для определения типа реального наследника, а также отключите проверку входных параметров ValueVisitor. Используйте отражение. Пожалуйста, смотрите более подробное описание в моем комментарии