0Pricing
TypeScript Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы инверсии управления
  2. Внедрение через конструктор
  3. DI-контейнеры с InversifyJS
  4. Типобезопасные токены служб
← Назад к TypeScript Academy