Я не могу понять, как использовать внедрение зависимостей в Nest JS по своему вкусу.
Вот моя структура проекта:
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
? Все, что я делаю, приводит к ошибке или не возможно - как импорт не может иметь строковое значение. Любая помощь приветствуется.