Как получить доступ к запрошенному запросу HotChocolate (GraphQL) с помощью IoC
Я пытаюсь улучшить производительность sql-запросов с помощью hotchocolate. Для этого я хотел получить доступ к запросу, сгенерированному hotchololate, в другом слое моего приложения. Единственный способ, которым я мог это сделать, - это перехватить запрос, сохранить необходимую мне информацию в элементах HttpContext, а затем внедрить IHttpContextAccessor там, где мне это нужно.
services.AddQueryRequestInterceptor(GraphQLRequestInterceptor);
...
private Task GraphQLRequestInterceptor(HttpContext context, IQueryRequestBuilder requestBuilder, CancellationToken cancellationToken)
{
IReadOnlyQueryRequest request = requestBuilder.Create();
context.Items.Add("graph", request);
}
А затем восстановите его, введя IHttpContextAccessor
public ClientesQueries(Microsoft.AspNetCore.Http.IHttpContextAccessor contextAccessor)
{
var queryRequest = contextAccessor.HttpContext.Items["graph"] as IReadOnlyQueryRequest;
}
С помощью этого кода я могу создать выражение для запроса моей базы данных только для тех данных, которые были запрошены клиентом.
Есть ли лучший способ добиться этого?
1 ответ
Я не совсем уверен, что мой ответ - это то, что вы просили, но именно так я получаю доступ к своему httpContext в моих запросах graphql.
Просто добавив: [Service]IHttpContextAccessor httpContext
как первые аргументы методов.
Полный пример в моем коде:
public async Task<IEnumerable<Tenant>> GetTenants([Service]IHttpContextAccessor httpContext)
{
var tenantId = await httpContext.HttpContext.GetUserTenantId();
return await _metadataRepo.Tenants.Get(x => x.TenantId == tenantId);
}
Вам не нужно создавать перехватчик. HttpContext уже находится в DI HotChocolate.
Удачи!