Как nest js работает и запускает конструкторы с параметром - PullRequest
0 голосов
/ 22 января 2020

Я новичок в гнезде JS и также не могу найти слишком много информации об этом, поэтому я также боюсь погрузиться в его исходный код (также новичок в машинописи). Я действительно хочу знать, как работают эти вещи, о которых я упомяну ниже

Во-первых: я смотрю учебник, где у нас есть сервис под названием Task

export class TasksController {
  constructor(private readonly tasksService: TasksService) { }

  Get()
  index() {
     this.tasksService.all();
  }
}

Здесь TasksService используется как просто тип, а не как класс, я думаю. В обычном машинописном тексте я написал бы что-то подобное

let task = new TasksController(new TasksService())

Тогда я мог бы позвонить this.tasksService.all();

Второе: Как @Injectable(), @Inject(), @InjectRepository() et c работает. Оригинальные документы немного сбивают с толку: (

1 Ответ

1 голос
/ 23 января 2020

Гнездо построено на идеях 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(), они не являются обычными поставщиками.

** это верно, если вы не имеете дело с инъекцией учеников, в этом случае вы не предоставляете токен.

*** Вы можете управлять этим с помощью пользовательских провайдеров

...