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

С помощью этого кода я могу создать выражение для запроса моей базы данных только для тех данных, которые были запрошены клиентом.

Есть ли лучший способ добиться этого?


person Lucas Phillip    schedule 09.01.2020    source источник


Ответы (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.

Удачи !

person MaxThom    schedule 23.03.2020