Приложение
DI-контейнер имеет лишь два метода: get и set. Для предоставления готовых контейнеров, имеющих при этом возможность расширения и подмены зарегистрированных компонентов, пакет isomorph предоставляет абстракцию "Application" в виде интерфейса и ее реализации.
Для создания базового набора зависимостей с возможностью его применения к приложениям, также предоставляется абстракция "Preset" и ее реализация.
Application
Application - класс объектов реализующих расширенный функционал DI-контейнеров.
Пример использования
Для начала создадим приложение для нашего Node.js сервера. Предполагается что у нас уж е есть константа с токенами компонентов.
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.
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);
При попытке достать компонент из приложения, в случае если он не зарегистрирован, будет выполнен поиск компонента по токену в "родительском" приложении. Однако "родительское" приложение не будет иметь доступа к компонентам своих "потомков".