Как получить доступ к запрошенному запросу 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.

Удачи!

Другие вопросы по тегам