|
|
@@ -9,6 +9,90 @@
|
|
|
npm install @e22m4u/service
|
|
|
```
|
|
|
|
|
|
+## ServiceContainer
|
|
|
+
|
|
|
+Метод `get` контейнера `ServiceContainer` инкапсулирует
|
|
|
+создание экземпляра полученного конструктора и сохраняет
|
|
|
+его для последующих обращений по принципу "одиночки".
|
|
|
+
|
|
|
+Пример:
|
|
|
+
|
|
|
+```js
|
|
|
+import {ServiceContainer} from '@e22m4u/service';
|
|
|
+
|
|
|
+// создание контейнера
|
|
|
+const container = new ServiceContainer();
|
|
|
+
|
|
|
+// для примера используется конструктор Date
|
|
|
+const myDate1 = container.get(Date);
|
|
|
+const myDate2 = container.get(Date);
|
|
|
+
|
|
|
+console.log(myDate1); // Tue Sep 12 2023 19:50:16
|
|
|
+console.log(myDate2); // Tue Sep 12 2023 19:50:16
|
|
|
+console.log(myDate1 === myDate2); // true
|
|
|
+```
|
|
|
+
|
|
|
+Метод `get` может принимать аргументы конструктора. При этом,
|
|
|
+если контейнер уже имеет сохраненный экземпляр данного
|
|
|
+конструктора, то он будет пересоздан с новыми аргументами.
|
|
|
+
|
|
|
+Пример:
|
|
|
+
|
|
|
+```js
|
|
|
+const myDate1 = container.get(Date, '2025-01-01');
|
|
|
+const myDate2 = container.get(Date);
|
|
|
+const myDate3 = container.get(Date, '2025-05-05');
|
|
|
+console.log(myDate1); // Wed Jan 01 2025 03:00:00
|
|
|
+console.log(myDate2); // Wed Jan 01 2025 03:00:00
|
|
|
+console.log(myDate3); // Sun May 05 2030 03:00:00
|
|
|
+```
|
|
|
+
|
|
|
+## Service
|
|
|
+
|
|
|
+Сервисом может являться совершенно любой класс. Однако,
|
|
|
+если это наследник встроенного класса `Service`, то такой
|
|
|
+сервис позволяет инкапсулировать создание самого
|
|
|
+сервис-контейнера и его хранение.
|
|
|
+
|
|
|
+Пример:
|
|
|
+
|
|
|
+```js
|
|
|
+// создадим сервис сообщений Messenger
|
|
|
+class Messenger {
|
|
|
+ // и метод выводящий полученное сообщение
|
|
|
+ send(message) {
|
|
|
+ console.log(`[Messenger] ${message}`);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// создадим сервис приветствия Greeter
|
|
|
+// наследуя поведение класса Service
|
|
|
+class Greeter extends Service {
|
|
|
+ // и приветствующий метод hello
|
|
|
+ hello(name) {
|
|
|
+ // в котором получим сервис Messenger,
|
|
|
+ // используя унаследованный метод getService
|
|
|
+ const messenger = this.getService(Messenger);
|
|
|
+ // и отправим наше приветствие методом send
|
|
|
+ messenger.send(`Hello ${name}!`);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// создадим экземпляр сервиса Greeter
|
|
|
+const greeter = new Greeter();
|
|
|
+
|
|
|
+greeter.hello('Peter');
|
|
|
+// [Messenger] Hello Peter!
|
|
|
+
|
|
|
+greeter.hello('Jesse');
|
|
|
+// [Messenger] Hello Jesse!
|
|
|
+```
|
|
|
+
|
|
|
+В примере выше мы не заботились о создании экземпляра
|
|
|
+сервис-контейнера и его передачу между сервисами, так как
|
|
|
+эта логика инкапсулирована в классе `Service` и его методе
|
|
|
+`getService`
|
|
|
+
|
|
|
## Тесты
|
|
|
|
|
|
```bash
|