Dependency Injection
Назначение
Эта страница описывает основной путь dependency injection в Nrgy.js через ditox и построенный поверх него React bridge.
Основные API
@nrgyjs/ditox:
withContainer()withInjections()applyInjections()
@nrgyjs/ditox-react:
DitoxNrgyExtension
Это основной и рекомендуемый DI integration path для Nrgy.js.
Когда использовать DI
DI подходит для инфраструктурных зависимостей, таких как:
- API clients
- loggers
- gateways
- analytics
DI не должен заменять явные feature inputs. Params и DI решают разные задачи.
Инъекция зависимостей в controllers
withInjections() резолвит значения из активного container и отдаёт их в controller logic через deps.
import { declareController } from '@nrgyjs/core';
import { withInjections } from '@nrgyjs/ditox';
import { token } from 'ditox';
const LOGGER = token<(message: string) => void>();
const LoggerController = declareController()
.extend(withInjections({ log: LOGGER }))
.apply(({ deps }) => ({
write: (message: string) => deps.log(message),
}));Wiring container
withContainer() является более низкоуровневым extension, который делает активный ditox container доступным во время создания controller.
Его стоит использовать, когда:
- доступ к container должен быть передан явно
- controller creation происходит вне стандартного React bridge
- нужна кастомная композиция extensions
applyInjections() адаптирует injected controller declarations к форме, удобной для container configuration, и помогает встроить их в DI wiring.
React плюс Ditox
Если приложение уже использует ditox внутри React, DitoxNrgyExtension является основным мостом между React tree и controller creation.
import React from 'react';
import { DitoxNrgyExtension } from '@nrgyjs/ditox-react';
export function App() {
return (
<DitoxNrgyExtension>
<FeatureRoot />
</DitoxNrgyExtension>
);
}Так React controller creation остаётся согласованным с активным dependency container, при этом DI не хардкодится в бизнес-логику.