Apollo GraphQL在服务端:完善领域模型
2023-09-12 02:36:35
GraphQL 作为下一代 API 规范,在服务端正越来越受到关注。
基于 GraphQL 的 API 服务在架构上来看算是 MVC 中的 controller。只是它只有一个固定的路由来处理所有请求。那么在和 MVC 框架结合使用时,在数据转换 ( Convertor )、参数校验 ( Validator ) 等功能上,使用 Apollo Gr…
无论是传统 Web API 的 REST 接口,还是基于 GraphQL 的 GraphQL 接口,在服务端处理业务请求时,都需要经历从请求报文到具体参数类型的数据转换、参数校验、执行业务操作等步骤。
对于任何一项软件的开发,抽象和分层都是至关重要的。特别是在面向对象的语言中,基于类的编程让开发者可以在编程时尽可能的将不同功能模块分离开来,这不仅让软件的维护变得更加容易,而且可以提升软件的可复用程度。
而当我们在使用 GraphQL 作为 API 规范时,为了和后端的数据结构相对应,我们需要定义一个 GraphQL Schema,它用来定义后端可以对外提供的数据结构和查询参数。
虽然说基于 GraphQL 的 API 服务在架构上来看算是 MVC 中的 controller,只是它只有一个固定的路由来处理所有请求。但当我们需要将GraphQL Schema 和服务端的数据结构绑定起来,也就是说将 Apollo GraphQL 引入到一个已有的MVC框架,例如 Nest.js框架时,还需要考虑参数校验、数据转换等功能。
那么在使用 GraphQL 时,我们应该如何将这些功能和 GraphQL Schema 结合起来呢?
在 TypeGraphQL 的文档中,有如下的
@ObjectType()
class Cat {
@Field()
id: number;
@Field()
name: string;
}
这段代码给定了一个 TypeGraphQL 的基础例子,其中 @Field()
装饰器用于定义 GraphQL Schema 中的字段,@ObjectType()
用于定义 GraphQL Schema 中的对象类型,在 TypeGraphQL 的文档中,还有类似的 @Resolver()
、@Query()
等装饰器,用于定义 GraphQL Schema 中的 resolver 和查询。
除了 TypeGraphQL,我们还可以选择 Micro GraphQL。
Micro GraphQL 是一个比 TypeGraphQL 更轻量的类装饰器,它同样可以用来定义 GraphQL Schema。
在 Micro GraphQL 的文档中,有如下的:
@ArgsType()
class CreateUserInput {
@Field()
username: string;
@Field()
password: string;
}
这段代码给定了一个 Micro GraphQL 的基础例子,其中 @ArgsType()
装饰器用于定义 GraphQL Schema 中的输入类型,@Field()
装饰器用于定义 GraphQL Schema 中的字段。
TypeGraphQL 和 Micro GraphQL 的区别在于,TypeGraphQL 是一个更全面的类装饰器,它可以用来定义 GraphQL Schema 中的几乎所有元素,而 Micro GraphQL 只是一个更轻量的类装饰器,它只能够用来定义 GraphQL Schema 中的输入类型、查询类型和订阅类型。
那么,我们在使用 GraphQL 时,应该选择 TypeGraphQL 还是 Micro GraphQL 呢?
在我们的项目中,我们选择了 Micro GraphQL。
原因在于,Micro GraphQL 更轻量,而且它完全可以满足我们的需求。
我们在使用 GraphQL 时,只需要定义 GraphQL Schema 中的输入类型、查询类型和订阅类型,而不需要定义其他的元素。
因此,Micro GraphQL 是一个更好的选择。
在实际使用中,我们发现 Micro GraphQL 在性能上也要比 TypeGraphQL 好一些。
TypeGraphQL 在定义 GraphQL Schema 时,需要用到反射,这会带来一定的性能开销。
而 Micro GraphQL 在定义 GraphQL Schema 时,不需要用到反射,因此它的性能要更好一些。
当然,TypeGraphQL 也有它自己的优势。
例如,TypeGraphQL 提供了更多的功能,它可以用来定义 GraphQL Schema 中的几乎所有元素。
因此,如果您需要定义一个非常复杂的 GraphQL Schema,那么 TypeGraphQL 可能是一个更好的选择。
但在大多数情况下,Micro GraphQL 都是一个更好的选择。
它更轻量、性能更好,而且完全可以满足我们的需求。