Hot Chocolate (GraphQL) interceptor/middleware 在数据获取之前获取 IQueryable
Hot Chocolate (GraphQL) interceptor/middleware to get IQueryable before data fetch
我需要对生成的 IQueryable 做一些额外的事情,但我无法创建拦截器来获取 IQueryable(例如记录由 GraphQL 请求创建的查询)。
我仍然沉浸在伟大的 material 中,那就是热巧克力,但对于初学者来说,我有这个:
直截了当吧?但是现在想要一个拦截器(或类似的东西)在 body 响应的结果之前给我生成的其余 IQueryable。
谢谢,
您可以使用中间件来做到这一点。
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`
}
});
}
}
在版本 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
}
}
我需要对生成的 IQueryable 做一些额外的事情,但我无法创建拦截器来获取 IQueryable(例如记录由 GraphQL 请求创建的查询)。
我仍然沉浸在伟大的 material 中,那就是热巧克力,但对于初学者来说,我有这个:
直截了当吧?但是现在想要一个拦截器(或类似的东西)在 body 响应的结果之前给我生成的其余 IQueryable。
谢谢,
您可以使用中间件来做到这一点。
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`
}
});
}
}
在版本 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
}
}