Выполнить запрос из кода

ASP.NET Core API with GraphQL request using HotChocolate in itself
https://stackoverflow.com/questions/73652499/asp-net-core-api-with-graphql-request-using-hotchocolate-in-itself

В случае, если подключен через DI.

var resolver = scope.ServiceProvider.GetRequiredService<IRequestExecutorResolver>();
var executor = await resolver.GetRequestExecutorAsync();

using var result = await executor.ExecuteAsync(query);
var resultJson = await result.ToJsonAsync();
Парсер запросовvar bytes = Encoding.UTF8.GetBytes(jsonRequest);
var requestData = new Span<byte>(bytes);
requestData = requestData.Slice(0, bytes.Length);

var parser = new Utf8GraphQLRequestParser(requestData);
return parser.Parse();
Перехват IQueryablepublic class IQueryableInterceptorAttribute
    : ObjectFieldDescriptorAttribute
{
   public IQueryableInterceptorAttribute([CallerLineNumber] int order = 0)
    {
        Order = order;
    }

   public override void OnConfigure(
        IDescriptorContext context,
        IObjectFieldDescriptor descriptor,
        MemberInfo member
        )
    {
        descriptor
            .Use(
                next => async context =>
                {
                   await next(context);

                   var scope = GraphQLIQueryableScope.Current;

                   if (scope is not null)
                    {
                        scope.SetData(context.Result!);
                        context.Result = null;
                    }
                }
            );
    }
}
Вычисляемые и внешние данные.

1) Используя механизм

Extending Types
https://chillicream.com/docs/hotchocolate/v13/defining-a-schema/extending-types

можно добавить к сущности дополнительные поля, при этом также есть возможность указать кастомную логику заполнения полей (Resolver).
Т.е. данные механизм можно использовать, чтобы сделать вычисляемый столбец и (или) столбец с данными на основе внешнего источника данных (например данных, которые не соединяются напрямую или же загружаются из внешнего web api).

public static void AddScalarResolver<TEntity, TType, TResolverType>(
   this IObjectTypeDescriptor<TEntity> descriptor,
   string fieldName
    )
   // Самодельный интерфейс для удобства, его нет в фреймворке.
   where TResolverType : IDataResolver<TType>
{
    descriptor
        .Field(fieldName)
        .Type<ScalarType<TType>>()
        .ResolveWith<TResolverType>(
            e => e.LoadAsync(default!, default)
            );
}

2) Добавив к вышеуказанному решению механизм

DataLoader
https://chillicream.com/docs/hotchocolate/v13/fetching-data/dataloader

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


3) При всех вышеуказанном, мы можем использовать в качестве сущности БД из EntityFramework | EntityFrameworkCore контекста, при этом имея встроенный механизм выборки IQueryable.

  
ТестированиеGraphQL - How to write integration tests against Hot Chocolate
https://chillicream.com/blog/2019/04/11/integration-tests
Теги: