Я новичок в NestJS и часто борюсь с его распознавателем служб, поэтому я хотел бы понять, как он разрешает службы, в надежде, что весь опыт использования NestJS перестанет быть разочаровывающим.
Этот вопрос связаниз странной (для меня) проблемы, с которой я столкнулся при разрешении конкретного провайдера. Представьте, что у меня есть очень простой модуль:
- src
- game
- game.module.ts
- game.repository.ts
Тогда мой модуль выглядит так:
@Module({
imports: [TypeOrmModule.forFeature([Game])],
providers: [GameRepository],
})
export class GameModule {
}
А мой класс GameRepository
(в game.repository.ts
) выглядит так:
@Injectable()
export class GameRepository {
public constructor(
@InjectRepository(Game)
private readonly gameRepository: Repository<Game>,
) {}
}
Это, отказывается компилировать. Я получу следующую ошибку: [ExceptionHandler] Nest can't resolve dependencies of the GameRepository (?). Please make sure that the argument at index [0] is available in the GameModule context. +64ms
.
В тот момент я подумал, что, возможно, он использует имя файла, чтобы определить, как должен создаваться экземпляр класса, поэтому я переименовал класс в GameService
и файл вgame.service.ts
и о чудо, теперь NestJS была счастлива, что могла успешно скомпилировать!
За исключением ... почему? Из сообщения об ошибке это не должно быть проблемой, к тому же я не уверен, что для NestJS имеет смысл использовать имя файла или класса для принятия какого-либо решения.
Мое понимание (которое явнона данном этапе это неверно) то, что аннотация @Injectable
определяет, какие классы будет создан экземпляром сервисного контейнера, а затем создается экземпляр того, что находится в массиве providers
модуля, и вводятся его зависимости. Но из вышеприведенного сценария это, кажется, не вся история.
Итак, все это говорит о том, что в документе нет раздела, в котором подробно описывается логика его IoC, и я бы хотелчтобы понять это.