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` создает экземпляр
 полученного конструктора и сохраняет его для последующих
@@ -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;
 ```
 
 Пример: