是否存在有关在NestJS中描绘和组织模块的最佳做法?

问题描述

假设有两个实体:CatPhoto。每张照片可以有一只猫,但每只猫可以有多张照片。用户应能够创建,读取,更新和删除猫和猫的照片。因此,对于以下端点,我具有GET,POST,PUT和DELETE方法

/cat
/cat/:id
/cat/:id/photo
/cat/:id/photo/:id

我对如何组织代码感到困惑。关于如何对此进行模块化,我看到了不同的选择。

选项1 :将所有内容扔到cat模块中。

└── cat
    ├── cat.controller.ts
    ├── cat.entity.ts
    ├── cat.module.ts
    ├── cat.service.ts
    ├── photo.entity.ts
    └── photo.service.ts

如果猫有很多关系,则控制器将不成比例地增长。如果其他实体以后可以拍照,这也会给我带来麻烦。

选项2 :将所有内容放在单独的模块中并相应地导入。

└── cat
    ├── cat.controller.ts
    ├── cat.entity.ts
    ├── cat.module.ts
    └── cat.service.ts
└── photo
    ├── photo.module.ts
    ├── photo.entity.ts
    └── photo.service.ts

如果每个实体只有一个模块,并且任何模块都必须从另一个模块导入任何相关实体,则这种方法会破坏干净分离的模块的目的,并最终导致一大团泥巴。

选项3 :将照片模块嵌套在cat模块中

└── cat
    ├── cat.controller.ts
    ├── cat.entity.ts
    ├── cat.module.ts
    ├── cat.service.ts
    └── photo
        ├── photo.module.ts
        ├── photo.entity.ts
        └── photo.service.ts

如果其他实体以后可以拍照,这仍然给我带来麻烦。

我觉得nestJS模块的树结构和实体关系的图结构之间存在固有的不匹配。也许我在做出错误的假设或对如何解决此问题有错误的观念。

关于如何描绘和关联nestJS模块是否有最佳实践?

解决方法

模块通常会增加额外的努力来做出这样的决定。 在您的情况下,照片可以应用于其他一些内容,例如用户、帖子等。因此必须将其分开。

尝试遵循这些简单的规则:

  1. 如果一个模块是另一个功能的一部分?如果是这样,它可能必须成为其中的一部分。

示例:发布和发布评论。您可能不需要将帖子评论作为单独的模块。

  1. 如果它是通用功能/模块?如果是,则应将其定义为独立模块。

示例:可以添加到用户和帖子的帖子、用户和评论。

  1. 还有一个更简单的:如果一个模块应该是一个全局的?那么它必须是一个独立的。

示例:事件

有时会想:如果我将这些作为一个单独的微服务来帮助做出正确的决定会怎样。