我的graphql解析器有一个循环依赖



我更改了存储库,以便它们直接返回GQL解析器。一切都很好,直到我添加了一个循环依赖:现在我有两个相互依赖的存储库。JavaScript没有办法解决这个依赖。有什么我能做的吗?存储库看起来像这样:

ARepository.getA = () => {
const a = getAFromDatabase();
return {
...a,
B: BRepository.getB()
}

和第二个存储库:

BRepository.getB = () => {
const b = getBFromDatabase();
return {
...b,
A: ARepository.getA()
}

每个存储库都依赖于另一个存储库,因此不可能在另一个存储库之前定义一个存储库。不能定义存储库

这是一个反模式。您可以创建一个泛型解析器的GraphQL类型,但没有到那个程度。

从一开始,将存储库与解析器耦合的事实就不是很好。存储库应该负责从数据库中获取记录,然后您可以有一个调用存储库的解析器。

您应该为每个查询定义一个特定的解析器,而不是每个类型。如果您有多个解析相同类型的查询,您可以将它们抽象为一些函数(让我们称它们为"gqlwrapper")。这些gqlWrappers应该扩展您的数据库原始记录,为叶节点/简单对象/值对象类型/字段提供解析器。(如果你不想进入循环依赖)。

如果你有一个依赖于B的gqlWrapper的类型a的gqlWrapper,然后你扩展B的gqlWrapper,使它依赖于a的gqlWrapper,你最终在相同的循环依赖不能解决。

假设您有类型A和类型B,它们彼此有引用,但也有其他可以抽象的部分。这就是我将如何实现getBQuery的解析器:

Queries: {
getB: async () => {
const b = BRepository.getB(); // The repo no longer returns complete resolvers, only database-raw-data
return {
...BGqlWrapper(b),
A: async () => {
const a = ARepository.getA();
return AGqlWrapper(a);  // I don't want to let the user get B again from A when he already started from B
}
}
}
}

相关内容

最新更新