适合 60+ 表的大型应用程序的最佳 Nest.js 架构

问题描述 投票:0回答:1

最初,该项目的范围较小,但后来显着扩大,使其成为一项大规模的努力。

目前,我的 Nest.js 应用程序的架构如下:

modules/
    ModuleA/
       /entities
         A
     A.module.ts
     A.controller.ts
     A.service.ts
    ModuleB/
      /entities
       B
     B.module.ts
     B.controller.ts
     B.service.ts

虽然这种方法遵循每个模块实体范例,但我认识到它可能不是最佳的。因此,我正在寻求指导来纠正这种疏忽。

您能否就组织我的 Nest.js 代码的最佳架构提出建议,特别是考虑到其巨大的规模?第一个版本预计涉及约 60 个表。

javascript typescript design-patterns architecture nestjs
1个回答
0
投票

您可以根据您的用例调整多种模式。由于您没有提供任何背景信息,我将提及一些当前趋势和历史证明的有用模式。

我的假设是:

  1. 你拥有一块巨石。
  2. 您实际上正在为代码的每个部分使用三层模型。
  3. 随着您的整体发展,三层模型正在成为一个障碍。

DDD - 领域驱动设计

如果您的应用程序包含大量领域逻辑和复杂的业务逻辑,则广泛建议遵循领域驱动设计原则。

六边形架构

除了域逻辑之外,如果您的整体变得巨大,还建议根据您的文件夹结构和整体模块结构调整应用程序、域、基础设施和演示者结构,而不是使用控制器、服务、模型结构。这是一个很大的主题,针对不同的问题有不同的概念和解决方案,因此请对这个架构进行深入的研究。

多样化的模块化策略

您应该将类和代码打包到模块中的位置不是由您的实体或域定义的;它是由许多变量定义的。

您可能需要根据功能进行划分(基于功能的模块化)。

现实世界的例子:

  • 产品目录模块:管理产品列表、类别和搜索功能。
  • 订单管理模块:管理购物车、订单处理和支付集成。
  • 评论和评级模块:处理用户对产品的评论和评级。
  • 报告模块:生成销售报告和用户活动报告。

也许是领域驱动的模块化,您的模块导出一系列服务(在这种情况下,服务类提供对领域逻辑和行为的访问)。

真实示例(银行应用程序):

  • 客户域:处理客户信息以及与客户相关的操作。
  • 账户域:管理不同类型的银行账户、账户操作和交易。
  • 贷款域:管理贷款产品、贷款申请和还款计划。
  • 交易域:处理所有类型的金融交易、交易历史和审计。

或者可能是基于基础设施层可能需要委托给另一个模块的技术职责的模块化。

  • 记录模块
  • 认证模块
  • 通知模块
  • 缓存模块:导出提供缓存策略、缓存失效、分布式缓存机制的服务

CQRS

有时,即使您在领域层编写和组织服务的方式也可能会导致问题。看起来您正在从 CRUD 操作转向不适合这四个类别的更复杂的操作。因此,我建议将您的观点从创建-读取-更新-删除思维方式转变为命令查询思维方式。强烈推荐 Martin Fowler 关于此主题的文章。

没有防弹解决方案

我知道,提到了很多。但也忘记了很多。

为了确保我们走在正确的轨道上,请记住,唯一万无一失的解决方案就是没有万无一失的解决方案。

您能否就组织我的 Nest.js 代码的最佳架构提供建议?

当我建议使用 DDD 时,我特别推荐它用于具有复杂业务逻辑的用例。其他原则和模式也是如此。如果您尝试为 CI/CD 基础设施管道(实用程序或基础设施应用程序)编写优化的操作触发器,您可能不想使用 DDD。

© www.soinside.com 2019 - 2024. All rights reserved.