0

假设我的类型类似于

type Node {
  parentNode: Node
  childNodes: [Node!]!
  friendNode: Node
}

在 NodeType 我使用 DataLoader 加载子节点

Field<NonNullGraphType<ListGraphType<NonNullGraphType<NodeType>>>, IEnumerable<Node>>()
  .Name("childNodes")
  .ResolveAsync(ctx =>
  {
    var nodesLoaded = accessor.Context.GetOrAddCollectionBatchLoader<int, Node>("GetNodesByParentIds", nodeRepo.GetNodesByParentIdsAsync);
    return nodesLoaded.LoadAsync(ctx.Source.Id);
  });

稍后我想加载父节点或朋友节点。然而,在某些“加载子节点”操作中可能已经加载了相同的节点

Field<NodeType, Node>()
  .Name("parentNode") //or friendNode
  .ResolveAsync(ctx =>
  {
    var nodeLoaded = accessor.Context.GetOrAddBatchLoader<int, Node>("GetNodesByIds", nodeRepo.GetNodesByIdsAsync);
    return nodeLoaded.LoadAsync(ctx.Source.ParentNodeId); //or FriendNodeId
  });

是否有支持的方法来使用解析“GetNodesByParentId”时获得的值预填充“GetNodesByIds”数据加载器,但仍然在未加载节点时调用存储库方法?

我发现的最佳解决方案是创建自定义“假”IDataLoader 来存储加载的节点和

  1. 在解决“GetNodesByParentIds”后填写此内容(在 .Then() 中)
  2. 在调用“GetNodesByIds”之前,检查具有 id 的节点是否是这个“假”数据加载器
  3. 如果节点不存在,则使用其他加载器 - 'GetNodesByIds'
4

0 回答 0