Сценарии
Вычисляемые и внешние данные. | 1) Используя механизм Extending Types можно добавить к сущности дополнительные поля, при этом также есть возможность указать кастомную логику заполнения полей (Resolver). 2) Добавив к вышеуказанному решению механизм DataLoader а именно BatchDataLoader, можно оптимизировать запросы и вычисления. 3) При всех вышеуказанном, мы можем использовать в качестве сущности БД из EntityFramework | EntityFrameworkCore контекста, при этом имея встроенный механизм филтьрации IQurable. public static void AddScalarResolver<TEntity, TType, TResolverType>( this IObjectTypeDescriptor<TEntity> descriptor, string fieldName ) // Самодельный интерфейс для удобства, его нет в фреймворке. where TResolverType : IDataResolver<TType> { descriptor .Field(fieldName) .Type<ScalarType<TType>>() .ResolveWith<CustomDataResolver>( e => e.LoadAsync(default!, default) ); } |
Асинхронное выполнение запросов | async await. Если я ничего не напутал в своем тестовом проекте, то обнаружил, что при конфигурации контракта важно возвращать именно IAsyncEnumerable<T>, а не IQueryable<T> (DbSet<T> напрямую). Если этого не сделать, то фреймворк будет загружать данные из БД синхронно, не используя IAsyncEnumerator<T>. |
Тестирование | GraphQL - How to write integration tests against Hot Chocolate https://chillicream.com/blog/2019/04/11/integration-tests |