我正在使用hotchocolate (v12)的最新版本中引入的新接口(V12)来动态创建所有类型的模式。(https://chillicream.com/blog/2021/09/27/hot-chocolate-12#dynamic-schemas)
效果很好。但是现在我很难找到如何使用这个策略在我的类型上添加过滤(因为我不能使用anotations,而且描述符也不像它在文档上的操作(https://chillicream.com/docs/hotchocolate/fetching-data/filtering) )。
到目前为止我尝试过的是:
我的依赖注入:
// code omitted
builder.Services
.AddGraphQLServer()
.AddTypeModule<DynamicTenantSchemaTypeModule>()
.AddFiltering();关于ITypeModule实现(DynamicTenantSchemaTypeModule):
//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但是它抛出以下异常:
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)对如何正确添加过滤中间件有什么想法吗?谢谢!
发布于 2022-06-24 05:40:06
到目前为止,我得到了一些领域的过滤工作,我不知道它从哪里来
的代码中应用筛选器约定
descriptor.UseFiltering<MyFilterConvention>(f =>
{
f.Name(schemaNamePascalCase + "OperationFilterInput");
});从class
,从而创建自定义筛选器约定MyFilterConvention
protected override void Configure(IFilterConventionDescriptor descriptor)
{
descriptor.AddDefaults();
descriptor.Provider(new QueryableFilterProvider(x =>
x.AddDefaultFieldHandlers()));
}这是对象Foo的结果。
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 ...
}https://stackoverflow.com/questions/71611131
复制相似问题