3

我正在使用 spring boot 和 graphql 开发一个新项目。我对如何进行感到困惑,因为有两种开发方法,一种是通过 graphqls 文件和基于注释的方法。我更喜欢基于注释的方法,但它们是否稳定。示例: https ://github.com/leangen/graphql-spqr 。

4

2 回答 2

4

支持 AllirionX 的回答,只是想添加一些细节。

首先,回答您的问题:是的,SPQR 已经相当稳定一段时间了。许多团队在生产中成功地使用了它。它仍在 0.X 版本中的唯一原因是缺少文档,但 API 中偶尔会发生小的重大变化。

其次,我还想补充一点,代码优先并不意味着你也不能合约优先。事实上,我认为你仍然应该以这种风格发展。唯一的区别是您可以将合约编写为 Java 接口而不是新语言。

正如我在SPQR 的自述文件中强调的那样:

请注意,以代码优先风格进行开发仍然是有效的模式优先,不同之处在于您不是用另一种语言开发模式,而是用 Java 开发模式,并使用您的 IDE、编译器和所有工具为您提供帮助。对架构进行重大更改意味着编译将失败。不需要 linter 或其他脆弱的黑客。

因此,API(如接口所描述的)是否随着其他代码的变化而变化完全取决于您。如果您出于任何原因需要 SDL,它始终可以从可执行模式或自省结果生成。

于 2019-12-09T19:13:52.227 回答
3

我认为“如何进行”这个问题没有好或坏的答案。有两种不同的方法来构建你的 graphql 服务器(使用 graphl-java、graphql-java-tools、graphql-spqr),每种方法都有其优点和不便之处。所有这些库都提出了一个 springboot 启动器。请注意,我从未使用过 graphql-spqr。

架构优先(使用 graphql-java 或 graphql-java-tools)

在这种方法中,您首先创建一个 SDL 文件。graphql 库将解析它,而“所有”您要做的就是将每个 graphql 类型连接到它的数据获取器。graphql-java-tools 甚至可以为您接线。

优势

  • 无需详细说明如何在服务器端构建 Graphql 模式
  • 你有一个很好的 graphql 模式文件,可以被客户端读取和使用,从而简化了构建 graphql 客户端的工作
  • 您实际上首先定义了您的 api(SDL 模式):更改 api 的实现不需要任何更改客户端

不方便

  • 没有编译时检查。如果某些东西没有正确连接,则会在运行时引发异常。但这可以通过使用graphql-java-codegen来消除,它会为您的 graphql 类型、联合、查询、枚举等生成 java 类和接口。
  • 如果使用 graphql-java(没有自动布线),我觉得我必须编写冗长无聊的数据获取器。所以我切换到了graphql-java-tools。

代码优先(使用 graphql-java 或 grapqhl-java-tools 或 graphql-spqr)

graphql 模式是以编程方式构建的(通过使用 graphql-spqr 进行注释或通过在 graphql-java 中构建 GraphQLSchema 对象)

优势

  • 编译时检查
  • 无需同时维护 SDL 和 Domain 类

不方便

  • 由于您的架构是从您的代码库生成的,因此更改您的代码库将更改 api,这对于依赖它的客户端可能不是很好。

这是我对这些不同框架的看法,我很高兴被证明我错了。最终决定取决于您的项目:大小、是否有现有代码库等。

于 2019-12-09T00:39:19.167 回答