在 NestJS 中获取解耦模块
Getting decoupled modules in NestJS
我似乎无法弄清楚如何根据自己的喜好在 NestJS 中使用依赖注入。
这是我的项目结构:
App --- User ------ Common
\ \-- Article --/
\--- Chat
换句话说:一个大的应用程序模块就是应用程序。功能模块 user
、article
和 chat
。现在如果一些功能想要与其他功能交互,它需要依赖 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 不应该为此抱怨任何错误。如果您遇到任何问题,请告诉我
我似乎无法弄清楚如何根据自己的喜好在 NestJS 中使用依赖注入。
这是我的项目结构:
App --- User ------ Common
\ \-- Article --/
\--- Chat
换句话说:一个大的应用程序模块就是应用程序。功能模块 user
、article
和 chat
。现在如果一些功能想要与其他功能交互,它需要依赖 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 不应该为此抱怨任何错误。如果您遇到任何问题,请告诉我