JS Внедрение зависимостей | JS Dependency injection

Версия 6.1 от Alexandr Fokin на 2020/07/14 10:05

Внедрение зависимостей в JavaScript.

Для внедрения зависимостей в JS можно использовать следующую схему.

1) Создаем класс ServieLocator. В нем будут содержаться все зависимости и метод для получения зависимости.
2) Создаем BaseClass, который:
Содержит статичный экземпляр ServieLocator.
В конструкторе принимает список зависимостей.
При выполнении конструктора запрашивает все необходимые зависимоти и бросате ошибку, если зависимость не найдена.

Вопрос абстракции.
Нет возможности определить интерфейс.
Как вариант определять класс без логики. Методы могут быть пустими и бросать ошибку: метод не реализован. Потомок либо переопределит метод либо получит ошибку при вызове.
В пустом классе определить статичное поле - имя абстракции, которое будет использоваться для регистрации и разрешения зависимости.

Схожим образом можно интегрироваться с фреймворком типа React:
Создать BaseReactComponent, от которого будут наследоваться все компоненты.
Базовый BaseReactComponent будет создавать экземпляр BaseClass, который выполнит иницилизацию зависимостей, а после полученные зависимости можно скопировать из BaseClass в BaseReactComponent.
При этом BaseReactComponent пробрасывает возможности конструктора BaseClass, позволяя передать массив необходимых зависимостей.

Для создания ServieLocator использовалась библитеока di-xxl. Как показывает практика библиотека не умеет самостоятельно анализировать конструктор и определять необходимые для экземпляра зависимости. Как вариант можно явно прописать список параметров, передаваемых в конструктор, в блоке регистрации зависимости. Но на мой взгляд, более хорошим решением является разрешение зависимостей через ServieLocator в конструкторе базового класса.

Теги: DI js
Создал(а) Alexandr Fokin 2020/07/12 19:30