首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将过滤添加到动态创建的模式中,使用hotchocolate (GraphQL)

将过滤添加到动态创建的模式中,使用hotchocolate (GraphQL)
EN

Stack Overflow用户
提问于 2022-03-25 01:15:20
回答 1查看 689关注 0票数 1

我正在使用hotchocolate (v12)的最新版本中引入的新接口(V12)来动态创建所有类型的模式。(https://chillicream.com/blog/2021/09/27/hot-chocolate-12#dynamic-schemas)

效果很好。但是现在我很难找到如何使用这个策略在我的类型上添加过滤(因为我不能使用anotations,而且描述符也不像它在文档上的操作(https://chillicream.com/docs/hotchocolate/fetching-data/filtering) )。

到目前为止我尝试过的是:

我的依赖注入:

代码语言:javascript
复制
// code omitted 
builder.Services
       .AddGraphQLServer()
       .AddTypeModule<DynamicTenantSchemaTypeModule>()
       .AddFiltering();

关于ITypeModule实现(DynamicTenantSchemaTypeModule):

代码语言:javascript
复制
    //code omitted
    public async ValueTask<IReadOnlyCollection<ITypeSystemMember>> CreateTypesAsync(IDescriptorContext context, CancellationToken cancellationToken)
    {
            var types = new List<ITypeSystemMember>();
            var queryType = new ObjectTypeDefinition("Query");
            var schemas = await _documentSchemaRepository.GetSchemasAsync();
            foreach (var schema in schemas)
            {
                var schemaNamePascalCase = schema.Name!.ToPascalCase();
                var schemaNamePluralCamelCase = schema.PluralName!.ToCamelCase();
                var objectTypeDefinition = new ObjectTypeDefinition(schemaNamePascalCase);
                await AddFieldsAsync(types, schema, objectTypeDefinition, schema.Properties);
                queryType.Fields.Add(new ObjectFieldDefinition(schemaNamePluralCamelCase)
                {
                    Type = TypeReference.Parse($"[{schemaNamePascalCase}]"),
                    Resolver = async (ctx) =>
                    {
                        var documents = await _documentRepository.GetDocumentsAsync(schema.Id);
                        return documents;
                    }
                }
                .ToDescriptor(context)
                .UseFiltering()
                .ToDefinition());
                types.Add(ObjectType.CreateUnsafe(objectTypeDefinition));
            }
            types.Add(ObjectType.CreateUnsafe(queryType));
            return types;
}
//code omitted

但是它抛出以下异常:

代码语言:javascript
复制
HotChocolate.SchemaException: For more details look at the `Errors` property.

1. No default filter convention found. Call `AddFiltering()` on the schema builder.

   at HotChocolate.Data.FilterDescriptorContextExtensions.<>c__DisplayClass1_0.<GetFilterConvention>b__0()
   at HotChocolate.Types.Descriptors.DescriptorContext.GetConventionOrDefault[T](Func`1 defaultConvention, String scope)
   at HotChocolate.Data.FilterDescriptorContextExtensions.GetFilterConvention(IDescriptorContext context, String scope)
   at HotChocolate.Types.FilterObjectFieldDescriptorExtensions.<>c__DisplayClass5_0.<UseFiltering>b__1(IDescriptorContext c, ObjectFieldDefinition definition)
   at HotChocolate.Types.Descriptors.DescriptorBase`1.<>c__DisplayClass19_0.<OnBeforeCreate>b__0(IDescriptorContext c, IDefinition d)
   at HotChocolate.Types.Descriptors.DescriptorBase`1.CreateDefinition()
   at HotChocolate.Types.Descriptors.DescriptorExtensions.ToDefinition[T](IDescriptor`1 descriptor)

对如何正确添加过滤中间件有什么想法吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-06-24 05:40:06

到目前为止,我得到了一些领域的过滤工作,我不知道它从哪里来

  1. 在配置

的代码中应用筛选器约定

代码语言:javascript
复制
descriptor.UseFiltering<MyFilterConvention>(f =>
{
  f.Name(schemaNamePascalCase + "OperationFilterInput");
});

从class

  • configure派生自定义过滤器约定(
  1. )以添加提供程序:

,从而创建自定义筛选器约定MyFilterConvention

代码语言:javascript
复制
protected override void Configure(IFilterConventionDescriptor descriptor)
{
  descriptor.AddDefaults();
  descriptor.Provider(new QueryableFilterProvider(x => 
    x.AddDefaultFieldHandlers()));
}

这是对象Foo的结果。

代码语言:javascript
复制
foos (
    where: FooOperationFilterInput
): [Foo]

input FooOperationFilterInput {
  and: [FooOperationFilterInput!]
  or: [FooOperationFilterInput!]
  scope: StringOperationFilterInput
}

input StringOperationFilterInput {
  and: [StringOperationFilterInput!]
  or: [StringOperationFilterInput!]
  eq: String
  neq: String
  ... the rest is omitted for brevity ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71611131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档