DI-контейнеры с InversifyJS
Регистрируйте и разрешайте службы с помощью контейнера
«DI-контейнеры с InversifyJS» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Зачем нужен DI container?
Ручная сборка больших графов объектов утомительна и приводит к ошибкам. DI container регистрирует способы создания каждой зависимости и разрешает их автоматически. InversifyJS — популярный container для TypeScript.
Установка и включение
InversifyJS использует декораторы и метаданные отражения. Вы импортируете их из inversify и включаете experimentalDecorators вместе с reflect-metadata.
import "reflect-metadata";
import { Container, injectable, inject } from "inversify";Пометка классов @injectable
Декоратор @injectable() сообщает container, что класс можно создать и внедрить. Он нужен для каждого класса, который создаёт container.
import { injectable } from "inversify";
@injectable()
class ConsoleLogger {
log(m: string) { console.log(m); }
}Объявление зависимостей с помощью @inject
Используйте @inject(token) для параметров конструктора, чтобы сообщить container, какую привязку следует передать. Токен идентифицирует зависимость.
@injectable()
class OrderService {
constructor(@inject("Logger") private logger: ConsoleLogger) {}
place() { this.logger.log("placed"); }
}Создание контейнера
Container хранит все привязки Вашего приложения. Вы создаёте его при запуске и регистрируете в нём зависимости.
import { Container } from "inversify";
const container = new Container();Привязка интерфейса к реализации
Цепочный API bind<T>(token).to(Impl) сопоставляет токен, часто являющийся интерфейсом, с конкретным классом, экземпляр которого создаст container.
interface Logger { log(m: string): void; }
container.bind<Logger>("Logger").to(ConsoleLogger);Разрешение сервисов
container.get<T>(token) создаёт запрошенный сервис, рекурсивно создавая и внедряя его зависимости.
container.bind<OrderService>(OrderService).toSelf();
const svc = container.get<OrderService>(OrderService);
svc.place();Замена реализаций
Чтобы использовать другой logger, привяжите токен к другому классу. Потребителей менять не нужно, поскольку они зависят от токена, а не от конкретного класса.
@injectable()
class SilentLogger implements Logger { log() {} }
container.rebind<Logger>("Logger").to(SilentLogger);Область действия единственного экземпляра
По умолчанию каждый вызов get может создавать новый экземпляр. Используйте inSingletonScope(), чтобы один экземпляр был общим для всего app.
container.bind<Logger>("Logger").to(ConsoleLogger).inSingletonScope();Тестирование с container
В тестах можно создать новый container и привязать подставные реализации, получив те же преимущества связывания и изолировав тестируемый компонент.
const testContainer = new Container();
testContainer.bind<Logger>("Logger").to(SilentLogger);Компромиссы при использовании контейнеров
Контейнеры уменьшают объём шаблонного кода в больших графах, но добавляют зависимость, декораторы и косвенность. В небольших приложениях ручное внедрение через конструктор часто понятнее.
Быстрая проверка
Краткая проверка по этому уроку.
Итоги
InversifyJS использует @injectable, @inject(token) и контейнер Container. Вы связываете bind<Interface>(token).to(Impl), а container.get автоматически разрешает граф зависимостей. Для этого требуются reflect-metadata и декораторы, что сокращает шаблонный код ценой дополнительного уровня косвенности.
Часто задаваемые вопросы
Урок «DI-контейнеры с InversifyJS» бесплатный?
Да — полный текст урока «DI-контейнеры с InversifyJS» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «DI-контейнеры с InversifyJS»?
Регистрируйте и разрешайте службы с помощью контейнера Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «DI-контейнеры с InversifyJS»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы инверсии управления
- Внедрение через конструктор
- DI-контейнеры с InversifyJS
- Типобезопасные токены служб