1

我们最近在我们的项目中引入了 GraphQL,我以前从未使用过它,但是我非常喜欢它。我们决定使用 .NET Core 的 HotChocolate 库和客户端的 Apollo。

我不太确定的一件事是关于突变,特别是使用突变执行更新和部分更新。 我在某处读到这种做法,我应该坚持为每个 update 创建特定的突变,例如 updateUsername()、updateAddress()、updateCity() 所有这些都应该有特定的突变。

问题在于,如果我决定朝这个方向发展,我的代码库将大幅增长,因为我们非常受数据驱动,每个表有很多表和列。

另一个问题是,如何处理可空属性,我可以创建一个接受某些输入对象的突变,但最终我的实体将被覆盖,并且调用端未提供的所有可空属性都将设置为空。 有没有办法部分处理这个更新,或者我应该为我想要更新的每个属性使用特定的更新突变?

4

1 回答 1

2

我认为您错误地理解了围绕特定突变的最佳实践。它不是“有一个突变来更新一个字段”,而是更多的是“有特定的突变来封装你的域中的动作”。一个具体的例子是创建一个“addItemToBasket”突变,而不是有 3 个突变来更新与您的购物篮等相关的各个表。

GraphQL 非常以前端开发为中心,因此您的变更通常应该与用户可以在您的前端执行的操作非常相似。例如,您的前端有一个“添加到购物篮”按钮,而您的后端有一个“addItemToBasket”突变,类似于将物品放入用户购物篮的动作。

如果您在设计突变时考虑到这一点,那么大多数时候您不应该遇到部分更新的问题,因为突变确切地知道要做什么,而且您不只是让架构的用户随意更新字段。

如果出于某种原因您需要进行这些部分更新,除非您的数据提供商支持,否则您可能无法自行实施修补程序。这意味着您必须拥有一个具有可为空属性的输入对象类型,以及决定哪些字段已更改并使用您的数据提供者更改它们的突变。

话虽如此,Hot Chocolate 存储库中还有一个修补类型的建议,应该简化修补部分:https ://github.com/ChilliCream/hotchocolate/issues/1326

于 2021-12-04T16:17:17.363 回答