Я часто читаю вопрос о том, как внедрить сервис/провайдера из другого модуля. В этой статье я хочу объяснить, как справиться с этим внутри экосистемы инверсии зависимостей NestJS с помощью простого проекта, который мы собираемся создать с нуля.

Кстати, весь проект я залил на Гитхаб.

Предпосылки

Требуется иметь базовое понимание Node.js и TypeScript. Я выберу Visual Studio Code в качестве редактора кода. Вы можете использовать все, что вы предпочитаете.

Приложение NestJS

Во-первых, мы собираемся установить интерфейс командной строки NestJS, поэтому откройте терминал по вашему выбору и введите:

$ npm i -g @nestjs/cli

Мы инициализируем новый проект NestJS с его CLI. Это может занять до минуты.

$ nest new nest-inject-sample -p npm

После выполнения этой команды вы можете открыть свой проект в редакторе кода. Поскольку я использую код Visual Studio, я собираюсь открыть проект, набрав:

$ cd nest-inject-sample
$ code .

Мой проект выглядит так в VSCode (код Visual Studio):

Давайте создадим два модуля (плюс их контроллер и службу) с помощью интерфейса командной строки NestJS. CLI создает эти модули для вас, добавляя их в src/app.module.ts.

$ nest g mo player && nest g co player --no-spec && nest g s player --no-spec
$ nest g mo item && nest g co item --no-spec && nest g s item --no-spec

Дерево вашего проекта должно выглядеть так:

Давайте запустим приложение, набрав в терминале:

$ npm run start:dev

Эта команда означает, что мы запускаем приложение, наблюдая за изменениями. Если мы внесем изменения, NestJS достаточно умен, чтобы автоматически перестроить приложение.

Теперь мы можем открыть приложение в нашем браузере: http://localhost:3000

Теперь давайте продолжим с нашими новыми модулями: Предмет и Игрок. Мы хотим внедрить ItemService (из ItemModule) внутрь PlayerService (из PlayerModule). Сначала я покажу вам, как выглядят файлы, а затем я покажу вам, как выглядят файлы после того, как мы внесли наши изменения.

Теперь мы собираемся экспортировать ItemService в наш ItemModule.

Пожалуйста, измените src/item/item.module.ts с:

to

Теперь мы экспортировали наш ItemService, что означает, что мы можем получить доступ к ItemService всякий раз, когда мы импортируем ItemModule, но сначала мы собираемся оживить наш ItemServiceпутем добавления метода, который возвращает массив строк, полный элементов.

Пожалуйста, измените src/item/item.service.ts с:

to

Большой. Давайте импортируем ItemModule внутрь нашего PlayerModule, чтобы получить доступ к ItemService.

Пожалуйста, измените src/player/player.module.ts с:

to

Теперь мы можем внедрить ItemService внутрь PlayerService. Кроме того, мы добавляем метод с именем findPlayerById просто для того, чтобы добавить немного жизни и проверить нашу инъекцию в конце.

Пожалуйста, измените src/player/player.service.ts с:

to

И последнее, но не менее важное: мы оживляем наш PlayerController.

Пожалуйста, измените src/player/player.controller.ts с:

to:

Вот и все! Мы внедрили ItemService в наш PlayerService и добавили несколько методов для тестирования нашего проекта прямо сейчас. Наше приложение все еще работает, поэтому мы просто открываем следующую ссылку в нашем браузере:

http://localhost:3000/player/find/1

Результат должен выглядеть примерно так:

Как мы видим, мы получили список элементов, который поступает непосредственно из нашего ItemService, даже если мы вызываем маршрут из нашего PlayerController.

Весь код вы можете найти на Github.

Хотите узнать больше о NestJS?

NestJS — отличный фреймворк, верно? Если вы хотите узнать больше, посмотрите видео Камила Мысливца, создателя NestJS, в котором подробно рассказывается о его фреймворке.

💡Примечание. Микросервисы могут быть сложными, но принятие правильных решений по идентификации и изоляции каждого микросервиса — это полдела. Ключевым моментом является обращение с архитектурой микросервисов как с составными строительными блоками, и это упрощается с помощью такого инструмента, как Bit, который позволяет вашим командам независимо публиковать, создавать версии, документировать, тестировать и совместно использовать отдельные компоненты, такие как функции. , модели данных и т. д., которые можно повторно использовать в нескольких микросервисах. Это может значительно уменьшить дублирование кода и повысить модульность и масштабируемость вашей системы. Подробнее здесь.

Спасибо, что прочитали мою статью о том, как внедрить сервис из другого модуля. Надеюсь, вы смогли узнать что-то новое.

Ваше здоровье!

Надеюсь, вам понравилось это читать. Если вы хотите поддержать меня как писателя, рассмотрите возможность подписки стать участником Medium. Всего 5 долларов в месяц, и вы получаете неограниченный доступ к Medium.

Хотите поддержать меня? Купи мне кофе.

Узнайте больше о NestJS





Создавайте компонуемые веб-приложения

Не создавайте веб-монолиты. Используйте Bit для создания и компоновки несвязанных программных компонентов — в ваших любимых фреймворках, таких как React или Node. Создавайте масштабируемые и модульные приложения с мощными и приятными возможностями разработки.

Перенесите свою команду в Bit Cloud, чтобы совместно размещать и совместно работать над компонентами, а также значительно ускорить, масштабировать и стандартизировать разработку в команде. Начните с компонуемых интерфейсов, таких как Design System или Micro Frontends, или исследуйте компонуемый сервер. Попробуйте →

Разделите приложения на компоненты, чтобы упростить разработку приложений, и наслаждайтесь наилучшими возможностями для рабочих процессов, которые вы хотите:

Микро-интерфейсы

Система дизайна

Совместное использование кода и повторное использование

Монорепо

Узнать больше