Как получить доступ к HotChocolate (GraphQL) запрошенного запроса с помощью IoC - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь улучшить производительность запроса 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 Ответ

0 голосов
/ 23 марта 2020

Я не совсем уверен, что мой ответ - это то, что вы запросили, но именно так я получаю доступ к своему 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.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...