e22m4u 1 месяц назад
Родитель
Сommit
aa61b9dad4
1 измененных файлов с 73 добавлено и 31 удалено
  1. 73 31
      README.md

+ 73 - 31
README.md

@@ -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` создает экземпляр
 Метод `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
 console.log(myDate3); // Sun May 05 2030 03:00:00
 ```
 ```
 
 
-### getRegistered
+### serviceContainer.getRegistered
 
 
 Работает аналогично `get`, но выбрасывает ошибку, если конструктор
 Работает аналогично `get`, но выбрасывает ошибку, если конструктор
 сервиса не был предварительно зарегистрирован через `add`, `use` или `set`.
 сервиса не был предварительно зарегистрирован через `add`, `use` или `set`.
@@ -434,7 +445,7 @@ const service = container.getRegistered(RegisteredService);
 container.getRegistered(UnregisteredService);
 container.getRegistered(UnregisteredService);
 ```
 ```
 
 
-### has
+### serviceContainer.has
 
 
 Проверяет, зарегистрирован ли конструктор в контейнере (или в одном
 Проверяет, зарегистрирован ли конструктор в контейнере (или в одном
 из его родительских контейнеров). Возвращает `true` или `false`.
 из его родительских контейнеров). Возвращает `true` или `false`.
@@ -462,7 +473,7 @@ container.add(MyService);
 console.log(container.has(MyService)); // true
 console.log(container.has(MyService)); // true
 ```
 ```
 
 
-### add
+### serviceContainer.add
 
 
 Метод регистрирует конструктор для ленивой инициализации. Экземпляр сервиса
 Метод регистрирует конструктор для ленивой инициализации. Экземпляр сервиса
 создается не в момент вызова `add`, а при первом обращении к нему через
 создается не в момент вызова `add`, а при первом обращении к нему через
@@ -503,7 +514,7 @@ console.log('After get');
 Аргументы, переданные в `add`, будут использованы при создании
 Аргументы, переданные в `add`, будут использованы при создании
 экземпляра, если `get` будет вызван без аргументов.
 экземпляра, если `get` будет вызван без аргументов.
 
 
-### use
+### serviceContainer.use
 
 
 В отличие от `add`, метод `use` немедленно создает и кэширует
 В отличие от `add`, метод `use` немедленно создает и кэширует
 экземпляр сервиса (моментальная инициализация).
 экземпляр сервиса (моментальная инициализация).
@@ -540,7 +551,7 @@ console.log('After use');
 const service = container.get(MyService); // возвращает готовый экземпляр
 const service = container.get(MyService); // возвращает готовый экземпляр
 ```
 ```
 
 
-### set
+### serviceContainer.set
 
 
 Метод `set` позволяет связать конструктор с уже существующим объектом.
 Метод `set` позволяет связать конструктор с уже существующим объектом.
 Это особенно полезно для подмены реализаций в тестах или для интеграции
 Это особенно полезно для подмены реализаций в тестах или для интеграции
@@ -584,7 +595,7 @@ console.log(api.fetch()); // "mock data"
 console.log(api === mock); // true
 console.log(api === mock); // true
 ```
 ```
 
 
-### find
+### serviceContainer.find
 
 
 Позволяет найти сервис по произвольному условию, заданному в функции-предикате.
 Позволяет найти сервис по произвольному условию, заданному в функции-предикате.
 Предикат получает конструктор и текущий контейнер в качестве аргументов.
 Предикат получает конструктор и текущий контейнер в качестве аргументов.
@@ -603,6 +614,14 @@ find<T extends object>(
   predicate: FindServicePredicate<T>,
   predicate: FindServicePredicate<T>,
   noParent?: boolean,
   noParent?: boolean,
 ): T | undefined;
 ): 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
 console.log(service2); // undefined
 ```
 ```
 
 
-### getParent и hasParent
+### serviceContainer.getParent и serviceContainer.hasParent
 
 
 Данные методы используются при работе с иерархией контейнеров. `hasParent`
 Данные методы используются при работе с иерархией контейнеров. `hasParent`
 проверяет наличие родителя, а `getParent` возвращает его или выбрасывает
 проверяет наличие родителя, а `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`, то такой сервис позволяет инкапсулировать
 наследник класса `Service`, то такой сервис позволяет инкапсулировать
@@ -746,13 +765,28 @@ const app = new App();
 и его передачу между сервисами, так как эта логика инкапсулирована
 и его передачу между сервисами, так как эта логика инкапсулирована
 в базовом классе `Service`
 в базовом классе `Service`
 
 
-### getService
+### service.getService
 
 
 Метод `getService` обеспечивает существование единственного экземпляра
 Метод `getService` обеспечивает существование единственного экземпляра
 запрашиваемого сервиса, а не создает каждый раз новый. Тем не менее при
 запрашиваемого сервиса, а не создает каждый раз новый. Тем не менее при
 передаче дополнительных аргументов, сервис будет пересоздан с передачей
 передаче дополнительных аргументов, сервис будет пересоздан с передачей
 этих аргументов конструктору.
 этих аргументов конструктору.
 
 
+Сигнатура:
+
+```ts
+/**
+ * Получить существующий или новый экземпляр.
+ *
+ * @param ctor
+ * @param args
+ */
+getService<T extends object>(
+  ctor: Constructor<T>,
+  ...args: any[],
+): T;
+```
+
 Пример:
 Пример:
 
 
 ```js
 ```js
@@ -765,7 +799,7 @@ const foo4 = this.getService(Foo);        // возврат уже пересо
 console.log(foo3 === foo4);               // true
 console.log(foo3 === foo4);               // true
 ```
 ```
 
 
-### getRegisteredService
+### service.getRegisteredService
 
 
 Работает аналогично `getService`, но выбрасывает ошибку, если конструктор
 Работает аналогично `getService`, но выбрасывает ошибку, если конструктор
 сервиса не был предварительно зарегистрирован через `add`, `use` или `set`.
 сервиса не был предварительно зарегистрирован через `add`, `use` или `set`.
@@ -806,7 +840,7 @@ class MyService extends Service {
 }
 }
 ```
 ```
 
 
-### hasService
+### service.hasService
 
 
 Проверяет, зарегистрирован ли конструктор в контейнере. Возвращает
 Проверяет, зарегистрирован ли конструктор в контейнере. Возвращает
 `true` или `false`. Полезно для условного запроса зависимостей.
 `true` или `false`. Полезно для условного запроса зависимостей.
@@ -839,7 +873,7 @@ class MyService extends Service {
 }
 }
 ```
 ```
 
 
-### addService
+### service.addService
 
 
 Регистрирует конструктор для ленивой инициализации. Экземпляр будет создан
 Регистрирует конструктор для ленивой инициализации. Экземпляр будет создан
 только при первом обращении к `getService`. Это позволяет сервисам настраивать
 только при первом обращении к `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>,
   predicate: FindServicePredicate<T>,
   noParent?: boolean,
   noParent?: boolean,
 ): T | undefined;
 ): T | undefined;
+
+/**
+ * Определение функции-предиката.
+ */
+type FindServicePredicate<T extends object> = (
+  ctor: Constructor<T>,
+  container: ServiceContainer,
+) => boolean;
 ```
 ```
 
 
 Пример:
 Пример: