Перейти к основному содержимому

Приложение

DI-контейнер имеет лишь два метода: get и set. Для предоставления готовых контейнеров, имеющих при этом возможность расширения и подмены зарегистрированных компонентов, пакет isomorph предоставляет абстракцию "Application" в виде интерфейса и ее реализации.

Для создания базового набора зависимостей с возможностью его применения к приложениям, также предоставляется абстракция "Preset" и ее реализация.

Application

Application - класс объектов реализующих расширенный функционал DI-контейнеров.

Пример использования

Для начала создадим приложение для нашего Node.js сервера. Предполагается что у нас уже есть константа с токенами компонентов.

app.ts
import { createApplication } from '@sima-land/isomorph/di';

export const app = createApplication();

// регистрируем константное значение
app.bind(TOKEN.config).toValue({ appName: 'ExampleApp' });

// регистрируем компонент с помощью провайдера
app.bind(TOKEN.logger).toProvider(provideLogger);

Аналогично DI-контейнеру, компоненты, зарегистрированные через провайдер будут инициализироваться "лениво".

После регистрации мы можем использовать компоненты с помощью метода get или вызвать callback который их получит с помощью метода invoke.

index.ts
import { app } from './app';

app.invoke([TOKEN.config, TOKEN.logger], (config, logger) => {
logger.info(config.appName);
});

Приложения можно связывать между собой с помощью метода attach.

import { createApplication } from '@sima-land/isomorph/di';

const parentApp = createApplication();
const childApp = createApplication();

childApp.attach(parentApp);

При попытке достать компонент из приложения, в случае если он не зарегистрирован, будет выполнен поиск компонента по токену в "родительском" приложении. Однако "родительское" приложение не будет иметь доступа к компонентам своих "потомков".