问题描述
假设有两个实体:Cat
和Photo
。每张照片可以有一只猫,但每只猫可以有多张照片。用户应能够创建,读取,更新和删除猫和猫的照片。因此,对于以下端点,我具有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模块是否有最佳实践?
解决方法
模块通常会增加额外的努力来做出这样的决定。 在您的情况下,照片可以应用于其他一些内容,例如用户、帖子等。因此必须将其分开。
尝试遵循这些简单的规则:
- 如果一个模块是另一个功能的一部分?如果是这样,它可能必须成为其中的一部分。
示例:发布和发布评论。您可能不需要将帖子评论作为单独的模块。
- 如果它是通用功能/模块?如果是,则应将其定义为独立模块。
示例:可以添加到用户和帖子的帖子、用户和评论。
- 还有一个更简单的:如果一个模块应该是一个全局的?那么它必须是一个独立的。
示例:事件
有时会想:如果我将这些作为一个单独的微服务来帮助做出正确的决定会怎样。