Сценарии
Выполнить запрос из кода | 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(); |
Перехват IQueryable | public 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 можно добавить к сущности дополнительные поля, при этом также есть возможность указать кастомную логику заполнения полей (Resolver). 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 а именно BatchDataLoader, можно оптимизировать запросы и вычисления. 3) При всех вышеуказанном, мы можем использовать в качестве сущности БД из EntityFramework | EntityFrameworkCore контекста, при этом имея встроенный механизм выборки IQueryable. |
Тестирование | GraphQL - How to write integration tests against Hot Chocolate https://chillicream.com/blog/2019/04/11/integration-tests |