Версия 8.1 от Alexandr Fokin на 2020/07/14 11:02

Скрыть последних авторов
Alexandr Fokin 2.1 1
2 **Внедрение зависимостей в JavaScript.**
3
4 Для внедрения зависимостей в JS можно использовать следующую схему.
5
6 1) Создаем класс ServieLocator. В нем будут содержаться все зависимости и метод для получения зависимости.
Alexandr Fokin 3.1 7 2) Создаем BaseClass, который:
Alexandr Fokin 2.1 8 Содержит статичный экземпляр ServieLocator.
9 В конструкторе принимает список зависимостей.
10 При выполнении конструктора запрашивает все необходимые зависимоти и бросате ошибку, если зависимость не найдена.
11
12
13 Вопрос абстракции.
14 Нет возможности определить интерфейс.
15 Как вариант определять класс без логики. Методы могут быть пустими и бросать ошибку: метод не реализован. Потомок либо переопределит метод либо получит ошибку при вызове.
Alexandr Fokin 4.1 16 В пустом классе определить статичное поле - имя абстракции, которое будет использоваться для регистрации и разрешения зависимости.
Alexandr Fokin 2.1 17
18
Alexandr Fokin 3.1 19 Схожим образом можно интегрироваться с фреймворком типа React:
20 Создать BaseReactComponent, от которого будут наследоваться все компоненты.
21 Базовый BaseReactComponent будет создавать экземпляр BaseClass, который выполнит иницилизацию зависимостей, а после полученные зависимости можно скопировать из BaseClass в BaseReactComponent.
22 При этом BaseReactComponent пробрасывает возможности конструктора BaseClass, позволяя передать массив необходимых зависимостей.
Alexandr Fokin 2.1 23
24
25
Alexandr Fokin 7.1 26 Для создания ServieLocator использовалась библитеока di-xxl. Как показывает практика библиотека не умеет самостоятельно анализировать конструктор и определять необходимые для экземпляра зависимости. Как вариант можно явно прописать список параметров, передаваемых в конструктор, в блоке регистрации зависимости. Но на мой взгляд, более хорошим решением является разрешение зависимостей через ServieLocator в конструкторе базового класса. В таком случае список зависимостей определен в самом классе, а не в блоке регистрации зависимостей.
Alexandr Fokin 8.1 27 (Возможно в данном варианте можно обойтись и без библиотеки di-xx. Сделав свое Key-Value хранилище привязок и поддержку singlethon)
Alexandr Fokin 2.1 28
Alexandr Fokin 7.1 29 Также хочу отметить важность создания строковых переменных с именами условных интерфейсов (привязок для внедрения). Чтобы в случае переименования интерфейса было достаточно заменить одну строковою переменную. А не искать по коду: где именно внедрялася данный интейс, чтобы изменить имя разрешения зависимости.
30