最初,该项目的范围较小,但后来显着扩大,使其成为一项大规模的努力。
目前,我的 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 个表。
您可以根据您的用例调整多种模式。由于您没有提供任何背景信息,我将提及一些当前趋势和历史证明的有用模式。
我的假设是:
如果您的应用程序包含大量领域逻辑和复杂的业务逻辑,则广泛建议遵循领域驱动设计原则。
除了域逻辑之外,如果您的整体变得巨大,还建议根据您的文件夹结构和整体模块结构调整应用程序、域、基础设施和演示者结构,而不是使用控制器、服务、模型结构。这是一个很大的主题,针对不同的问题有不同的概念和解决方案,因此请对这个架构进行深入的研究。
您应该将类和代码打包到模块中的位置不是由您的实体或域定义的;它是由许多变量定义的。
您可能需要根据功能进行划分(基于功能的模块化)。
现实世界的例子:
也许是领域驱动的模块化,您的模块导出一系列服务(在这种情况下,服务类提供对领域逻辑和行为的访问)。
真实示例(银行应用程序):
或者可能是基于基础设施层可能需要委托给另一个模块的技术职责的模块化。
有时,即使您在领域层编写和组织服务的方式也可能会导致问题。看起来您正在从 CRUD 操作转向不适合这四个类别的更复杂的操作。因此,我建议将您的观点从创建-读取-更新-删除思维方式转变为命令查询思维方式。强烈推荐 Martin Fowler 关于此主题的文章。
我知道,提到了很多。但也忘记了很多。
为了确保我们走在正确的轨道上,请记住,唯一万无一失的解决方案就是没有万无一失的解决方案。
您能否就组织我的 Nest.js 代码的最佳架构提供建议?
当我建议使用 DDD 时,我特别推荐它用于具有复杂业务逻辑的用例。其他原则和模式也是如此。如果您尝试为 CI/CD 基础设施管道(实用程序或基础设施应用程序)编写优化的操作触发器,您可能不想使用 DDD。