@lad-tech/nsc-toolkit 1.14.0 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -2
- package/README.md +18 -3
- package/dist/Container.js +21 -0
- package/dist/types/Container.d.ts +14 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# [1.
|
|
1
|
+
# [1.15.0](https://github.com/lad-tech/nsc-toolkit/compare/v1.14.0...v1.15.0) (2023-08-16)
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
### Features
|
|
5
5
|
|
|
6
|
-
*
|
|
6
|
+
* symbol().to syntax ([#72](https://github.com/lad-tech/nsc-toolkit/issues/72)) ([90e361e](https://github.com/lad-tech/nsc-toolkit/commit/90e361e001ad0b0686ed066e15102fb90209ead9))
|
package/README.md
CHANGED
|
@@ -273,7 +273,7 @@ npm i
|
|
|
273
273
|
|
|
274
274
|
- `getListener` 一 метод получения объекта `EventEmitter` для подписки на события сервиса.
|
|
275
275
|
|
|
276
|
-
3. Класс `Container`. Реализует DI-контейнре. Сам класс не доступен для импорта, а доступен только его экземпляр, что позволяет реализовать шаблон Singlton. В микросервисном варианте контейнер один на сервис. В монолитном варианте использования контейнер один на все приложение. За счет
|
|
276
|
+
3. Класс `Container`. Реализует DI-контейнре. Сам класс не доступен для импорта, а доступен только его экземпляр, что позволяет реализовать шаблон Singlton. В микросервисном варианте контейнер один на сервис. В монолитном варианте использования контейнер один на все приложение. За счет использования объектов Symbol в качестве ключей для привязки зависимостей исключены коллизии при привязках зависимостей в разных частях приложения через один контейнер. Для привязки зависимости к ключу необходимо указать тип зависимости. Это нужно чтобы библиотека могла корректно создать экземпляр зависимости. Всего существуют 3 вида зависимостей:
|
|
277
277
|
|
|
278
278
|
- `service` 一 сервис как зависимости.
|
|
279
279
|
- `adapter` 一 класс с набором синхронных или асинхронных методов. Например репозиторий или фасад от стороннего API. Этот тип зависимости можно настроить с помощью необязательного объекта настроек. У опций адаптера могут быть следующие настройки:
|
|
@@ -286,7 +286,22 @@ npm i
|
|
|
286
286
|
}
|
|
287
287
|
```
|
|
288
288
|
Если адаптер реализует требуемые методы и при передачи флага `init` при привязки адаптера адаптер можно будет инициализировать через контейнер использую метод контейнера `init`. Если к контейнеру было привязано несколько адаптеров, которые необходимо инициализировать, то после вызова метода контейнера `init` все адаптеры будут инициализированны последовательно. Метод инициализации вернет массив инициализированных экземпляров адаптеров. Каждый адаптер с настройкой `init` также становится singlton'ом.
|
|
289
|
-
- `constant`一 обычный объект.
|
|
289
|
+
- `constant`一 обычный объект. Например, объект с конфигурацией.
|
|
290
|
+
- Альтернативный синтаксис привязки с учетом вышеизложенной информации
|
|
291
|
+
```js
|
|
292
|
+
// Простой адаптер
|
|
293
|
+
container.symbol(key).to.Adapter(InitializableService);
|
|
294
|
+
// константа
|
|
295
|
+
container.symbol(key2).to.Constant({ obj: 'value' });
|
|
296
|
+
// Синглтон
|
|
297
|
+
container.symbol(key).to.Singlton(mySingleton);
|
|
298
|
+
// Сервис с автоинициазлзацией
|
|
299
|
+
container.symbol(key).to.Initializable(InitializableService);
|
|
300
|
+
// Сервис
|
|
301
|
+
container.symbol(key).to.Service(MyService);
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
```
|
|
290
305
|
|
|
291
306
|
Публичные методы:
|
|
292
307
|
|
|
@@ -464,4 +479,4 @@ Service/
|
|
|
464
479
|
┌---------┐ ┌───────────-┐ ┌───────────---┐ ┌---------┐
|
|
465
480
|
| GetUser |--->│ Repository |--->| Configurator |--->| Storage |
|
|
466
481
|
└---------┘ └─────-─────-┘ └─────-─────---┘ └---------┘
|
|
467
|
-
```
|
|
482
|
+
```
|
package/dist/Container.js
CHANGED
|
@@ -49,6 +49,27 @@ class Container {
|
|
|
49
49
|
bind(key, type, value, options) {
|
|
50
50
|
this.container.set(key, { type, value, options });
|
|
51
51
|
}
|
|
52
|
+
symbol(key) {
|
|
53
|
+
return {
|
|
54
|
+
to: {
|
|
55
|
+
Adapter: (value, options) => {
|
|
56
|
+
this.container.set(key, { type: _1.DependencyType.ADAPTER, value, options });
|
|
57
|
+
},
|
|
58
|
+
Singlton: (value) => {
|
|
59
|
+
this.container.set(key, { type: _1.DependencyType.ADAPTER, value, options: { singlton: true } });
|
|
60
|
+
},
|
|
61
|
+
Constant: (value) => {
|
|
62
|
+
this.container.set(key, { type: _1.DependencyType.CONSTANT, value, options: { singlton: true } });
|
|
63
|
+
},
|
|
64
|
+
Initializable: (value) => {
|
|
65
|
+
this.container.set(key, { type: _1.DependencyType.ADAPTER, value, options: { init: true } });
|
|
66
|
+
},
|
|
67
|
+
Service: (value) => {
|
|
68
|
+
this.container.set(key, { type: _1.DependencyType.SERVICE, value });
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
52
73
|
async unbind(key) {
|
|
53
74
|
this.container.delete(key);
|
|
54
75
|
const instance = this.singltons.get(key);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ClientService, DependencyType, InitializableService } from '.';
|
|
2
2
|
type Constant = Record<string, any>;
|
|
3
3
|
type Service<R extends Constant = Constant> = ClientService<R>;
|
|
4
4
|
export type Adapter<R extends Constant = Constant> = new (...args: any[]) => R;
|
|
@@ -27,6 +27,19 @@ declare class Container {
|
|
|
27
27
|
bind<R extends Record<string, any>>(key: symbol, type: typeof DependencyType.ADAPTER, value: Adapter<R>, options?: Singlton): void;
|
|
28
28
|
bind<R extends Record<string, any>>(key: symbol, type: typeof DependencyType.ADAPTER, value: Adapter<R & InitializableService>, options?: NeedInit): void;
|
|
29
29
|
bind<R extends Record<string, any>>(key: symbol, type: typeof DependencyType.CONSTANT, value: R): void;
|
|
30
|
+
symbol(key: symbol): {
|
|
31
|
+
to: {
|
|
32
|
+
Adapter: <R extends Record<string, any>>(value: Adapter<R & import("./interfaces").GracefulShutdownAdditionalService & {
|
|
33
|
+
init: () => Promise<any>;
|
|
34
|
+
}>, options?: AdapterOptions) => void;
|
|
35
|
+
Singlton: <R_1 extends Record<string, any>>(value: Adapter<R_1>) => void;
|
|
36
|
+
Constant: <R_2 extends Record<string, any>>(value: R_2) => void;
|
|
37
|
+
Initializable: <R_3 extends Record<string, any>>(value: Adapter<R_3 & import("./interfaces").GracefulShutdownAdditionalService & {
|
|
38
|
+
init: () => Promise<any>;
|
|
39
|
+
}>) => void;
|
|
40
|
+
Service: <R_4 extends Record<string, any>>(value: ClientService<R_4>) => void;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
30
43
|
unbind(key: symbol): Promise<void>;
|
|
31
44
|
get(key: symbol): {
|
|
32
45
|
dependency: ContainerValue;
|