Гнездо построено на идеях Angular, в которых много говорится о Внедрении зависимостей и Разделении интересов . Эти идеи приходят из более объектно-ориентированных языков, таких как Java и C ++, и особенно из фреймворков, таких как Spring / SpringBoot .
Introduciton
С этим, Nest делает много вещей, «соединяя» провайдеров вместе, чтобы позволить разработчикам не беспокоиться о создании экземпляров каждого класса, а позволить инфраструктуре справиться с этим за них. Сначала я расскажу о вашей второй точке, и, надеюсь, она поможет пролить свет на первую точку.
Декораторы Injectable Inject и InjectRepsotiory
Все декораторы в машинописи используются для установки метаданных. Затем Nest прочитает эти метаданные и ответит на них соответствующим образом. По большей части, все это решается скрытно с помощью настройки DI-системы.
@Injectable()
сообщает Nest: «Эй, этот класс является провайдером * и как таковой, он должен иметь возможность вводить значения в него и быть может быть внедрен в других провайдеров. Все ваши услуги будут помечены как @Injectable()
вместе с несколькими специальными классами.
@Inject()
- это декоратор, который принимает токен инъекции **. Это говорит Nest: «Эй, я хочу ввести провайдера, привязанного к токену, который я только что дал вам. Сделайте экземпляр и введите его здесь. Маркер может быть строкой или символом, но он должен быть уникальным (т. Е. Не должен быть sh с другим провайдером). Use может использовать один и тот же токен несколько раз.
@InjectRepository()
/ @InjectModel()
это специальные @Inject()
декораторы, которые используют стандартный декоратор @Inject()
под капотом, чтобы сохранить инъекцию токен в соответствии с токенами инъекции, которые Nest уже создает в TypeormModule
и MongooseModule
Как это работает (вроде)
Итак, теперь мы знаем немного больше о метаданных, которые устанавливают декораторы, давайте поговорим о том, как Nest разрешает зависимости. Что делает гнездо, так это сканирует каждый класс и находит метаданные, если оно @Injectable()
или нет. (@Controller()
и другие декораторы делают это). Затем он просматривает классы в конструкторе и выясняет, есть ли у этого класса токен инъекции (классы определяются только по имени, если не указано иное ***). Если нет, он проверяет, существует ли для него @Inject()
декоратор, и находит его значение c для использования. Если он найдет класс, он его создаст, сохранит в кеше и предоставит классу. Если это значение, оно напрямую предоставляется классу.
Чтобы получить более подробную информацию, ознакомьтесь с DI и узнайте, как другие платформы также справляются с этим. Angular - отличный ресурс, потому что, как я уже сказал, Nest получил много вдохновения от
Сносок:
* исключения включают в себя охрану, перехватчики, трубы и фильтры. Хотя это @Injectable()
, они не являются обычными поставщиками.
** это верно, если вы не имеете дело с инъекцией учеников, в этом случае вы не предоставляете токен.
*** Вы можете управлять этим с помощью пользовательских провайдеров