如何处理每个资源的多个查询



我想使用GraphQL和GraphiQL包创建带有.NET Core的GraphQL API。我为用户和任务创建了一个查询

public sealed class UserQuery : ObjectGraphType
{
private List<User> users = new List<User>();
public UserQuery()
{
Field<ListGraphType<UserType>>(
"users",
"Returns a collection of users.",
resolve: context => users);
}
}
public sealed class TaskQuery : ObjectGraphType
{
private List<Task> tasks = new List<Task>();
public TaskQuery()
{
Field<ListGraphType<TaskType>>(
"tasks",
"Returns a collection of tasks.",
resolve: context => tasks);
}
}

我创建了两个模式;寄存器";查询

public sealed class UserSchema : GraphQL.Types.Schema
{
public UserSchema(UserQuery userQuery)
{
Query = userQuery;
}
}
public sealed class TaskSchema : GraphQL.Types.Schema
{
public TaskSchema(TaskQuery taskQuery)
{
Query = taskQuery;
}
}

不幸的是,我看到这是不可能的,因为我必须将ISchema注册为单例服务

serviceCollection
.AddSingleton<ISchema, UserSchema>()
.AddSingleton<ISchema, TaskSchema>();

因此CCD_ 2覆盖CCD_ 3。一种解决方案是使用一个单一的模式和一个包含UserQueryTaskQuery内容的查询,但事情很快就会变得一团糟,不是吗?

有什么更好的分配资源的主意吗?

我认为当处理100个甚至更多的字段时,事情可能会变得非常复杂。

每个GraphQL模式都需要只包含一种查询类型:https://graphql.org/learn/schema/

并且一个端点只能呈现一个模式如果你想把它拆分成多个文件,你可以使用分部类您可以使用分部类,但您可能需要执行一些反射魔术来从ctor分发代码。可以使用反射来调用类中以"开头的任何方法;Init";例如然后分部类可以声明init方法以及它们需要的

或者,您也可以探索热巧克力,在那里您不需要声明单个模式。您可以添加所有不同的查询类型,它们会自动合并。

最新更新