什么类型的实现会更适合服务层?

What type of implementation will be more suitable in service layer?

我正在开发一个新的微服务应用程序,它将成为具有许多其他微服务的大架构的一部分。这个应用程序需要从其他应用程序获取内容,我想将 HTTP 调用封装到服务层。但我注意到有两种不同的方法。


假设我的应用程序将从另一个部署为 User API.

的微服务获取联系信息
  1. 企业文件

此方法将公司名称作为文件名。在文件中,只有一个 public 方法,即 get 并且它接收一个参数。该方法调用 user-api/contact/{id}.

文件名: contact.service.js

方法get(id) -> contact

  1. API 作为文件

这种方法将 用户 API 和消费者应用程序之间的所有通信封装到一个文件中。为 User API.

提供的每个端点都有一个方法

文件名: user.service.js

方法getContact(id) -> contact


使用这些方法的优缺点是什么?

这个问题其实更像是一个意见问题,不同的公司/不同的软件开发商可能会给你不同的答案。

我对此的看法是,我认为将它们拆分成各自的文件——如果逻辑很复杂,甚至拆分到方法——对可维护性/测试有很大帮助。

  • 测试:如果您在测试文件中使用相同的拆分模式 - 我在结构方面模仿我们的代码并这样做,我发现它可以帮助人们更轻松地找到代码,完全按照他们想要的方式执行测试执行他们。 Something like test contact.service.test.js 更改被隔离,他们可以非常轻松地 运行 立即进行相关测试。
  • 可维护性:我尽量在最后一个服务层中保持尽可能小的东西。这并不是说一切都是抽象的,一层又一层你找不到真正的代码/但即便如此,我也会将服务拆分为不同文件中的方法,名称非常方便。通过这种方式,文档制作非常简单,您只需将所有需要的内容写在同一个文件中即可。
  • 代码审查:变得容易得多,它强制每个文件中的更改很小,因为您的文件内容少得多。

问自己这些问题;

  • 您的服务中是否包含非常复杂的逻辑,这会将文件扩展到数千行 - 使其更难记录/更难发现错误/更难重构?或者它们是较小的端点,逻辑被卸载到系统的其他部分?

  • 这些方法/服务的测试是否将存在于(另一个)单个文件中 - 模仿服务实现中的模式?您可以在测试功能时调用单独的测试吗?

  • 您准备好适应您在所有服务中做出的决定了吗?您的特定服务因此那个确切的文件可能相对较小,那么您的一位同事可能编写并变成一个巨大的 1K 行文件的服务呢?