假设我的类型类似于
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 来存储加载的节点和
- 在解决“GetNodesByParentIds”后填写此内容(在 .Then() 中)
- 在调用“GetNodesByIds”之前,检查具有 id 的节点是否是这个“假”数据加载器
- 如果节点不存在,则使用其他加载器 - 'GetNodesByIds'