c# - 如何处理每个资源的多个查询?
问题描述
我想使用 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>();
所以TaskSchema
覆盖UserSchema
. 一种解决方案是使用一个单一的模式和一个包含的内容的单一查询UserQuery
,TaskQuery
但是事情很快就会变得一团糟,不是吗?
有什么更好的办法来分割资源?
我认为在处理 100 个甚至更多字段时,事情可能会变得非常复杂。
解决方案
每个 GraphQL 模式都需要只包含一种查询类型:https ://graphql.org/learn/schema/
一个端点只能显示一种模式。如果要将其拆分为多个文件,则可以使用部分类。
您可以使用部分类,但您可能需要做一些反射魔术才能从 ctor 分发代码。例如,可以使用反射来调用类中以“Init”开头的任何方法。然后部分类可以声明 init 方法和他们需要什么
或者,您也可以探索热巧克力,您不需要声明单个模式。您可以添加所有不同的查询类型,它们会自动合并。
推荐阅读
- haskell - 不能定义多个可执行文件
- asp.net-mvc - 从 API 下载文件
- c# - C# - 动态创建对象
- php - ElasticSearch 索引错误
- c# - 我在文本框中输入了机器名称,但是现在我想用空字符串替换它,它没有被替换
- vue.js - 在 vuejs 中扩展事件监听器
- c# - 为什么 tne 控制台只给我偶数?
- android-espresso - 安卓。Espresso:如何编写测试检查 TextView 上的文本是否有下划线?
- node.js - mongodb topology.s.promiseLibrary 未定义
- sql - 在 SQL 中加入来自 2 个表的数据