Arc icon indicating copy to clipboard operation
Arc copied to clipboard

Graphql获取父链路中的各节点数据

Open wangyuheng opened this issue 3 years ago • 6 comments

现状

举例为3层实体结构 Project 1->N Milestone 1->N Task。

在Task的操作中,可以通过env.getSource()获取 Milestone,但是无法获取Project的信息。

在约定中,认为任意子节点可以获取其与聚合根的路径节点中的数据。

期望

可以在当前节点获取父节点&父节点的父节点的数据

wangyuheng avatar Jan 26 '21 14:01 wangyuheng

  • [ ] 增强graphql描述聚合关系语义的能力,可能的方案是增加一个directive
  • [ ] 增强DataFetchingEnvironment接口,增加 getParentSource 接口;
  • [ ] 简单实现:在preHandle中解析parent并将其设置在context中,并通过解析directive获取到上一级路径的节点的名称,获取context其中的值
  • 局限性:该实现不支持继承链中的名称重复

lozybean avatar Jan 27 '21 11:01 lozybean

还需要一个描述值对象的directive

lozybean avatar Jan 27 '21 12:01 lozybean

image

wangyuheng avatar Jan 28 '21 05:01 wangyuheng

举例场景

  1. 一个Project下有多个Milestone
  2. 一个Milestone下有多个Task
  3. 查询: Milestone下的Tasks
  4. 查询: Project下的Tasks

明确2个概念

  1. 路径: 指实际请求中Graphql经过的方法,比如 Project->Milestone->Task or Project->Task。 此时Task的parent是不同的,即 getSource()
  2. Parent: 领域中关系。在领域设计中,认为Task属于Milestone 则 通过Project->Task查询时,getParent()获取到的也是对应的Milestone

wangyuheng avatar Jan 28 '21 05:01 wangyuheng

扩展问题

约束问题

  1. 一个type 是否允许有多个Parent
  2. 一个type 能否被多个type引用
  3. 如果内部实体也提供了相应方法,则需要根据聚合根找到实体,再进行方法调用。这样是不是破坏了聚合根的封装?

声明问题

  1. 是否需要区分 实体、聚合根和值对象? -> 是否所有type都可以指定Parent

wangyuheng avatar Jan 28 '21 05:01 wangyuheng