使用 Nest.JS PlatoBlockchain 数据智能实现干净的架构。 垂直搜索。 人工智能。

用 Nest.JS 实现一个干净的架构

本文适用于努力编写干净、可扩展且更重要的是可重构代码的爱好者。 它将介绍 Nest.JS 如何帮助我们编写干净的代码以及它使用的底层架构。

用 Nest.JS 实现一个干净的架构需要我们首先理解这个框架是什么以及它是如何工作的。

Nest 或 Nest.JS 是一个框架,用于构建使用 TypeScript 构建的高效、可扩展的 Node.js 应用程序(服务器端)。 它使用 Express 或 Fastify 并允许一定程度的抽象,以使开发人员能够在其代码中使用大量模块(第三方)。

让我们更深入地了解这个干净的架构到底是什么。 

好吧,你们可能都使用过或至少听说过 MVC 架构。 MVC 代表模型、视图、控制器。 这背后的想法是将我们的项目结构分成 3 个不同的部分。

1。 模型:它将包含与数据库中的关系/文档映射的对象文件。

2.控制器: 它是请求处理程序,负责业务逻辑实现和所有数据操作。

3.查看: 这部分将包含与数据显示有关的文件,HTML 文件或一些模板引擎文件。

要创建模型,我们需要某种 ORM/ODM 工具/模块/库来构建它。 例如,如果你直接使用模块,比如说'sequelize',然后在你的控制器中使用它来实现登录,并使你的核心业务逻辑依赖于'sequelize'。 现在,假设 10 年后,市场上有一个更好的工具你想使用,但是一旦你用它替换 sequelize,你将不得不更改很多代码行以防止它打破。 此外,您必须再次测试所有功能以检查其是否已成功部署,这也可能会浪费宝贵的时间和资源。 为了克服这个挑战,我们可以使用 SOLID 的最后一个原则,即依赖倒置原则,以及一种称为依赖注入的技术来避免这种混乱。

还在迷茫吗? 让我详细解释一下。

所以,依赖倒置原则用简单的话来说就是,你创建你的核心业务逻辑,然后围绕它构建依赖。 换句话说,将您的核心逻辑和业务规则从任何类型的依赖中解放出来,并修改外层,使它们依赖于您的核心逻辑,而不是您的逻辑依赖于此。 这就是干净的架构。 它从您的核心业务逻辑中取出依赖关系,并围绕它构建系统,使它们似乎依赖于它而不是依赖于它们。

让我们尝试通过下图来理解这一点。

Sumber: 干净的建筑锥体 

你可以看到我们已经把我们的架构分成了4层:

1. 实体: 在其核心,实体是定义您的企业规则并说明应用程序是什么的模型(企业规则)。 这一层几乎不会随着时间而改变,通常是抽象的,不能直接访问。 例如,每个应用程序都有一个“用户”。 用户应该存储的所有字段、它们的类型以及与其他实体的关系将构成一个实体。

2.用例: 它告诉我们如何实施企业规则。 让我们再次以用户为例。 现在我们知道要对哪些数据进行操作,用例告诉我们如何对这些数据进行操作,例如用户将有一个需要加密的密码,需要创建用户,并且可以随时更改密码给定的时间点等

3. 控制器/网关: 这些是帮助我们使用依赖注入使用外部工具和库来实现用例的渠道。

4. 外部工具: 我们用来构建逻辑的所有工具和库都将在这一层下,例如。 ORM、Emailer、加密等

我们使用的工具将取决于我们如何将它们引导到用例,反过来,用例将取决于作为我们业务核心的实体。 通过这种方式,我们将依赖关系从外向内反转。 这就是 SOLID 的依赖倒置原则所暗示的。

好的,到目前为止,您已经了解了 Nest.JS 的要点并了解了干净架构的工作原理。 现在问题来了,这两者有什么关系?  

让我们尝试了解 Nest.JS 的 3 个构建块是什么以及它们各自的作用。

  1. 模块: Nest.JS 的结构使得我们可以将每个功能视为一个模块。 例如,任何与用户链接的东西,如模型、控制器、DTO、接口等,都可以分离为一个模块。 一个模块有一个控制器和一堆提供者,它们是可注入的功能,如服务、orm、电子邮件等。
  1. 控制器: Nest.JS 中的控制器是网络和逻辑之间的接口。 它们用于处理请求并将响应返回到应用程序的客户端(例如,调用 API)。
  1. 提供者(服务): 提供者是可注入的服务/功能,我们可以将其注入控制器和其他提供者以提供灵活性和额外的功能。 它们抽象出任何形式的复杂性和逻辑。

总而言之,

  • 我们有充当接口的控制器(清洁架构的第 3 层)
  • 我们有可以注入提供功能的提供程序(干净架构的第 4 层:数据库、设备等)
  • 我们还可以创建服务和存储库来定义我们的用例(第二层)
  • 我们可以使用数据库提供者(第一层)定义我们的实体

总结

Nest.JS 是一个强大的 Node.JS 框架,也是当今最知名的 typescript。 现在您已经了解了这个框架,您一定想知道我们是否可以使用它来构建一个具有干净架构的项目结构。 嗯,答案是——是的! 绝对地。 如何? 我将在本文的下一个系列中进行解释。 

到此为止,敬请期待!

作者简介:

Junaid Bhat 目前在 Mantra Labs 担任技术主管。 他是一名技术爱好者,每天都在努力成为一名更好的工程师,遵循行业标准,并采用更有条理的方法来解决问题。 

阅读我们最新的博客: Golang-Beego 框架及其应用

值得在您的收件箱中传递的知识

时间戳记:

更多来自 咒实验室