|
|
@@ -333,19 +333,30 @@ const myService = container.get(MyService);
|
|
|
|
|
|
Методы:
|
|
|
|
|
|
-- `get(ctor, ...args)` получить существующий или новый экземпляр;
|
|
|
-- `getRegistered(ctor, ...args)` получить существующий или новый
|
|
|
+- [`get(ctor, ...args)`](#servicecontainerget) получить существующий или новый экземпляр;
|
|
|
+- [`getRegistered(ctor, ...args)`](#servicecontainergetregistered) получить существующий или новый
|
|
|
экземпляр, только если указанный конструктор зарегистрирован
|
|
|
в контейнере, в противном случае выбрасывается ошибка;
|
|
|
-- `has(ctor)` проверить существование конструктора в контейнере;
|
|
|
-- `add(ctor, ...args)` добавить конструктор в контейнер (ленивая инициализация);
|
|
|
-- `use(ctor, ...args)` добавить конструктор и сразу создать экземпляр;
|
|
|
-- `set(ctor, service)` добавить конструктор и связанный с ним готовый экземпляр;
|
|
|
-- `find(predicate, noParent = false)` найти сервис удовлетворяющий условию;
|
|
|
-- `getParent()` получить родительский сервис-контейнер;
|
|
|
-- `hasParent()` проверить наличие родительского сервис-контейнера;
|
|
|
+- [`has(ctor)`](#servicecontainerhas) проверить существование конструктора в контейнере;
|
|
|
+- [`add(ctor, ...args)`](#servicecontaineradd) добавить конструктор в контейнер (ленивая инициализация);
|
|
|
+- [`use(ctor, ...args)`](#servicecontaineruse) добавить конструктор и сразу создать экземпляр;
|
|
|
+- [`set(ctor, service)`](#servicecontainerset) добавить конструктор и связанный с ним готовый экземпляр;
|
|
|
+- [`find(predicate, noParent = false)`](#servicecontainerfind) найти сервис удовлетворяющий условию;
|
|
|
+- [`getParent()`](#servicecontainergetparent-и-servicecontainerhasparent) получить родительский сервис-контейнер;
|
|
|
+- [`hasParent()`](#servicecontainergetparent-и-servicecontainerhasparent) проверить наличие родительского сервис-контейнера;
|
|
|
|
|
|
-### get
|
|
|
+В сигнатурах методов используется вспомогательный тип конструктора:
|
|
|
+
|
|
|
+```ts
|
|
|
+/**
|
|
|
+ * Конструктор класса.
|
|
|
+ */
|
|
|
+interface Constructor<T extends object = object> {
|
|
|
+ new (...args: any[]): T;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### serviceContainer.get
|
|
|
|
|
|
Метод `get` класса `ServiceContainer` создает экземпляр
|
|
|
полученного конструктора и сохраняет его для последующих
|
|
|
@@ -396,7 +407,7 @@ console.log(myDate2); // Wed Jan 01 2025 03:00:00
|
|
|
console.log(myDate3); // Sun May 05 2030 03:00:00
|
|
|
```
|
|
|
|
|
|
-### getRegistered
|
|
|
+### serviceContainer.getRegistered
|
|
|
|
|
|
Работает аналогично `get`, но выбрасывает ошибку, если конструктор
|
|
|
сервиса не был предварительно зарегистрирован через `add`, `use` или `set`.
|
|
|
@@ -434,7 +445,7 @@ const service = container.getRegistered(RegisteredService);
|
|
|
container.getRegistered(UnregisteredService);
|
|
|
```
|
|
|
|
|
|
-### has
|
|
|
+### serviceContainer.has
|
|
|
|
|
|
Проверяет, зарегистрирован ли конструктор в контейнере (или в одном
|
|
|
из его родительских контейнеров). Возвращает `true` или `false`.
|
|
|
@@ -462,7 +473,7 @@ container.add(MyService);
|
|
|
console.log(container.has(MyService)); // true
|
|
|
```
|
|
|
|
|
|
-### add
|
|
|
+### serviceContainer.add
|
|
|
|
|
|
Метод регистрирует конструктор для ленивой инициализации. Экземпляр сервиса
|
|
|
создается не в момент вызова `add`, а при первом обращении к нему через
|
|
|
@@ -503,7 +514,7 @@ console.log('After get');
|
|
|
Аргументы, переданные в `add`, будут использованы при создании
|
|
|
экземпляра, если `get` будет вызван без аргументов.
|
|
|
|
|
|
-### use
|
|
|
+### serviceContainer.use
|
|
|
|
|
|
В отличие от `add`, метод `use` немедленно создает и кэширует
|
|
|
экземпляр сервиса (моментальная инициализация).
|
|
|
@@ -540,7 +551,7 @@ console.log('After use');
|
|
|
const service = container.get(MyService); // возвращает готовый экземпляр
|
|
|
```
|
|
|
|
|
|
-### set
|
|
|
+### serviceContainer.set
|
|
|
|
|
|
Метод `set` позволяет связать конструктор с уже существующим объектом.
|
|
|
Это особенно полезно для подмены реализаций в тестах или для интеграции
|
|
|
@@ -584,7 +595,7 @@ console.log(api.fetch()); // "mock data"
|
|
|
console.log(api === mock); // true
|
|
|
```
|
|
|
|
|
|
-### find
|
|
|
+### serviceContainer.find
|
|
|
|
|
|
Позволяет найти сервис по произвольному условию, заданному в функции-предикате.
|
|
|
Предикат получает конструктор и текущий контейнер в качестве аргументов.
|
|
|
@@ -603,6 +614,14 @@ find<T extends object>(
|
|
|
predicate: FindServicePredicate<T>,
|
|
|
noParent?: boolean,
|
|
|
): T | undefined;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Определение функции-предиката.
|
|
|
+ */
|
|
|
+type FindServicePredicate<T extends object> = (
|
|
|
+ ctor: Constructor<T>,
|
|
|
+ container: ServiceContainer,
|
|
|
+) => boolean;
|
|
|
```
|
|
|
|
|
|
Пример:
|
|
|
@@ -649,7 +668,7 @@ const service2 = child.find(ctor => ctor.id === 'shared', true);
|
|
|
console.log(service2); // undefined
|
|
|
```
|
|
|
|
|
|
-### getParent и hasParent
|
|
|
+### serviceContainer.getParent и serviceContainer.hasParent
|
|
|
|
|
|
Данные методы используются при работе с иерархией контейнеров. `hasParent`
|
|
|
проверяет наличие родителя, а `getParent` возвращает его или выбрасывает
|
|
|
@@ -692,15 +711,15 @@ console.log(hasService); // true
|
|
|
|
|
|
Методы:
|
|
|
|
|
|
-- `getService(ctor, ...args)` получить существующий или новый экземпляр;
|
|
|
-- `getRegisteredService(ctor, ...args)` получить существующий или новый
|
|
|
+- [`getService(ctor, ...args)`](#servicegetservice) получить существующий или новый экземпляр;
|
|
|
+- [`getRegisteredService(ctor, ...args)`](#servicegetregisteredservice) получить существующий или новый
|
|
|
экземпляр, только если указанный конструктор зарегистрирован
|
|
|
в контейнере, в противном случае выбрасывается ошибка;
|
|
|
-- `hasService(ctor)` проверить существование конструктора в контейнере;
|
|
|
-- `addService(ctor, ...args)` добавить конструктор в контейнер;
|
|
|
-- `useService(ctor, ...args)` добавить конструктор и создать экземпляр;
|
|
|
-- `setService(ctor, service)` добавить конструктор и его экземпляр;
|
|
|
-- `findService(predicate, noParent = false)` найти сервис удовлетворяющий условию;
|
|
|
+- [`hasService(ctor)`](#servicehasservice) проверить существование конструктора в контейнере;
|
|
|
+- [`addService(ctor, ...args)`](#serviceaddservice) добавить конструктор в контейнер;
|
|
|
+- [`useService(ctor, ...args)`](#serviceuseservice) добавить конструктор и создать экземпляр;
|
|
|
+- [`setService(ctor, service)`](#servicesetservice) добавить конструктор и его экземпляр;
|
|
|
+- [`findService(predicate, noParent = false)`](#servicefindservice) найти сервис удовлетворяющий условию;
|
|
|
|
|
|
Сервисом может являться совершенно любой класс. Однако, если это
|
|
|
наследник класса `Service`, то такой сервис позволяет инкапсулировать
|
|
|
@@ -746,13 +765,28 @@ const app = new App();
|
|
|
и его передачу между сервисами, так как эта логика инкапсулирована
|
|
|
в базовом классе `Service`
|
|
|
|
|
|
-### getService
|
|
|
+### service.getService
|
|
|
|
|
|
Метод `getService` обеспечивает существование единственного экземпляра
|
|
|
запрашиваемого сервиса, а не создает каждый раз новый. Тем не менее при
|
|
|
передаче дополнительных аргументов, сервис будет пересоздан с передачей
|
|
|
этих аргументов конструктору.
|
|
|
|
|
|
+Сигнатура:
|
|
|
+
|
|
|
+```ts
|
|
|
+/**
|
|
|
+ * Получить существующий или новый экземпляр.
|
|
|
+ *
|
|
|
+ * @param ctor
|
|
|
+ * @param args
|
|
|
+ */
|
|
|
+getService<T extends object>(
|
|
|
+ ctor: Constructor<T>,
|
|
|
+ ...args: any[],
|
|
|
+): T;
|
|
|
+```
|
|
|
+
|
|
|
Пример:
|
|
|
|
|
|
```js
|
|
|
@@ -765,7 +799,7 @@ const foo4 = this.getService(Foo); // возврат уже пересо
|
|
|
console.log(foo3 === foo4); // true
|
|
|
```
|
|
|
|
|
|
-### getRegisteredService
|
|
|
+### service.getRegisteredService
|
|
|
|
|
|
Работает аналогично `getService`, но выбрасывает ошибку, если конструктор
|
|
|
сервиса не был предварительно зарегистрирован через `add`, `use` или `set`.
|
|
|
@@ -806,7 +840,7 @@ class MyService extends Service {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### hasService
|
|
|
+### service.hasService
|
|
|
|
|
|
Проверяет, зарегистрирован ли конструктор в контейнере. Возвращает
|
|
|
`true` или `false`. Полезно для условного запроса зависимостей.
|
|
|
@@ -839,7 +873,7 @@ class MyService extends Service {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### addService
|
|
|
+### service.addService
|
|
|
|
|
|
Регистрирует конструктор для ленивой инициализации. Экземпляр будет создан
|
|
|
только при первом обращении к `getService`. Это позволяет сервисам настраивать
|
|
|
@@ -875,7 +909,7 @@ class App extends Service {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### useService
|
|
|
+### service.useService
|
|
|
|
|
|
Немедленно создает и кэширует экземпляр сервиса. Может использоваться, когда
|
|
|
сервис должен быть проинициализирован сразу при настройке другого компонента.
|
|
|
@@ -912,7 +946,7 @@ class App extends Service {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### setService
|
|
|
+### service.setService
|
|
|
|
|
|
Позволяет связать конструктор с уже существующим объектом. Может быть
|
|
|
использован для подмены зависимостей на мок-объекты, например,
|
|
|
@@ -953,7 +987,7 @@ class MyComponent extends Service {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### findService
|
|
|
+### service.findService
|
|
|
|
|
|
Находит сервис по заданному условию (предикату). Поиск по умолчанию
|
|
|
ведется рекурсивно вверх по иерархии контейнеров.
|
|
|
@@ -971,6 +1005,14 @@ findService<T extends object>(
|
|
|
predicate: FindServicePredicate<T>,
|
|
|
noParent?: boolean,
|
|
|
): T | undefined;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Определение функции-предиката.
|
|
|
+ */
|
|
|
+type FindServicePredicate<T extends object> = (
|
|
|
+ ctor: Constructor<T>,
|
|
|
+ container: ServiceContainer,
|
|
|
+) => boolean;
|
|
|
```
|
|
|
|
|
|
Пример:
|