0

我正在尝试用 hotchocolate 提高 sql 查询性能。为此,我想在我的应用程序的另一层访问由 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;
}

使用该代码,我可以创建一个表达式来仅查询我的数据库以获取客户端请求的数据。

有没有更好的方法来实现这一目标?

4

1 回答 1

2

我不确定我的答案是您的要求,但这就是我在我的 graphql 请求中访问我的 httpContext 的方式。

只需添加 :[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 已经在 HotChocolate 的 DI 中。

祝你好运 !

于 2020-03-23T20:59:04.740 回答