Hot Chocolate (GraphQL) 拦截器/中间件在数据获取之前获取 IQueryable

Júl*_*ida 7 c# graphql asp.net-core .net-5 hotchocolate

我需要对生成的 IQueryable 做一些额外的事情,但我无法创建拦截器来获取 IQueryable (例如记录 GraphQL 请求创建的查询)。

我仍在深入研究热巧克力这一伟大的材料,但对于初学者来说,我有这个:

在此输入图像描述

直接前进吧?但现在想要一个拦截器(或类似的东西),它可以在结果传递给主体响应之前为我提供生成的 IQueryable 的其余部分。

谢谢你,

Pas*_*enn 14

您可以使用中间件来做到这一点。

public class Query
{
    [UseYourCustom]
    [UseProjection]
    [UseFiltering]
    [UseSorting]
    public IQueryable<Person> GetPersons() => //...
}

public class UseYourCustomAttribute : ObjectFieldDescriptorAttribute
{
    public override void OnConfigure(
        IDescriptorContext context,
        IObjectFieldDescriptor descriptor,
        MemberInfo member)
    {
        descriptor.Use(next => async context =>
        {
            // before the resolver pipeline
            await next(context);
            // after the resolver pipeline

            if (context.Result is IQueryable<Person> query)
            {
               // all middleware are applied to `query`
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在版本 12 中,您还可以执行以下操作:

public class Query
{
    [UseProjection]
    [UseFiltering]
    [UseSorting]
    public IQueryable<Person> GetPersons(IResolverContext context)
    {
        IQueryable<Person> person = //...

        var allMiddlewareApplied = persons
            .Sort(context)
            .Filter(context)
            .Project(context);

        return allMiddlewareApplied
    }
}

Run Code Online (Sandbox Code Playgroud)