Arc
Arc copied to clipboard
Graphql获取父链路中的各节点数据
现状
举例为3层实体结构 Project 1->N Milestone 1->N Task。
在Task的操作中,可以通过env.getSource()
获取 Milestone,但是无法获取Project的信息。
在约定中,认为任意子节点可以获取其与聚合根的路径节点中的数据。
期望
可以在当前节点获取父节点&父节点的父节点的数据
- [ ] 增强graphql描述聚合关系语义的能力,可能的方案是增加一个directive
- [ ] 增强DataFetchingEnvironment接口,增加
getParentSource
接口; - [ ] 简单实现:在
preHandle
中解析parent并将其设置在context
中,并通过解析directive获取到上一级路径的节点的名称,获取context
其中的值
- 局限性:该实现不支持继承链中的名称重复
还需要一个描述值对象的directive
举例场景
- 一个Project下有多个Milestone
- 一个Milestone下有多个Task
- 查询: Milestone下的Tasks
- 查询: Project下的Tasks
明确2个概念
- 路径: 指实际请求中Graphql经过的方法,比如 Project->Milestone->Task or Project->Task。 此时Task的parent是不同的,即
getSource()
- Parent: 领域中关系。在领域设计中,认为Task属于Milestone 则 通过Project->Task查询时,
getParent()
获取到的也是对应的Milestone
扩展问题
约束问题
- 一个type 是否允许有多个Parent
- 一个type 能否被多个type引用
- 如果内部实体也提供了相应方法,则需要根据聚合根找到实体,再进行方法调用。这样是不是破坏了聚合根的封装?
声明问题
- 是否需要区分 实体、聚合根和值对象? -> 是否所有type都可以指定Parent