在 NestJS 中获取解耦模块

Getting decoupled modules in NestJS

我似乎无法弄清楚如何根据自己的喜好在 NestJS 中使用依赖注入。

这是我的项目结构:

App --- User ------ Common
  \ \-- Article --/
   \--- Chat

换句话说:一个大的应用程序模块就是应用程序。功能模块 userarticlechat。现在如果一些功能想要与其他功能交互,它需要依赖 common 模块。

在我的简单案例中是: 文章数据库有关于作者的简单对象。因此,一旦它检索到文章数据,它就想检索作者(用户)的数据。但它一定不能在 user 模块上看到。

我的解决方案是在公共模块中有 service 个接口。

export interface UserCommonService {
    getUser(id: string): Promise<User | null>
}

真正的UserService会实现这个公共服务,通过依赖注入我会在控制器中得到它而不依赖user模块。

@Injectable()
export class UserService implements UserCommonService {
  async getUser(id: string): Promise<User | null> {
    ...
  }
}

@ApiTags("v1/article")
@Controller("v1/article")
export class ArticleController {
  constructor(
    private readonly articleService: ArticleService,
    @Inject('UserService') private readonly userService: UserCommonService
  ) { }

  @Get(":id")
  async getArticle(@Param("id") id: string): Promise<...> {
    const article = await this.articleService.getArticle(id)
    const user = await this.userService.getUser(article.author.id)

    return {author: user, article: article}
  }
}

现在我不知道如何在 DI 模块中完成这项工作。据我所知,我在 user.module.ts

中添加了以下内容
@Module({
  imports: [TypegooseModule.forFeature([User])],
  controllers: [UserController],
  providers: [UserService, { provide: 'UserService', useClass: UserService }],
  exports: ['UserService']
})

但是我不知道在 article.module 中输入什么来导入它。或者可能到 app.module?我所做的一切都会导致错误或不可能——比如导入不能有字符串值。 任何帮助表示赞赏。

两件事:

在你的 user.module.ts 中,providers 数组中应该只有 UserService 一次,并像这样导出

@Module({
  imports: [TypegooseModule.forFeature([User])],
  controllers: [UserController],
  providers: [{ provide: 'UserService', useClass: UserService }],
  exports: ['UserService']
})
export class UserModule {}

我建议将 'UserService' 字符串更改为常量或 symbol 以使其可重复使用而不会拼写错误,但这取决于您。

然后在您的 article.module.ts 中允许 @Inject('UserService') 您只需要像这样导入 UserModule

@Module({
  imports: [UserModule, TypegooseModule.forFeature([Article]),
  controller: [ArticleController],
  providers: [ArticleService]
})
export class ArticleModule {}

Nest 不应该为此抱怨任何错误。如果您遇到任何问题,请告诉我