Dependency injection
Utilidad
Esta librería te permitirá montar un contenedor de inyección de dependencias.
Instalación
npm i --save @codescouts/di
Dependencias
Si quieres implementar esta librería sin React, puedes usar 👇
npm i ts-injecty --save
Implementación en React
Tendrás que envolver tus componentes con el HOC DependencyInjectionContainer y de esta manera el contenedor estará a tu disposición cuando lo necesitas utilizando el hook useResolve
import { BrowserRouter, Route, Routes } from "react-router-dom";
import { useEvents } from "@codescouts/ui";
import { DependencyInjectionContainer } from "@codescouts/di";
import { NewLogRegisteredHandler } from "@domain/events";
import { Header } from "@ui/components";
import { Home } from "@ui/pages";
import { buildDependencies } from "./di";
const App = () => {
useEvents(() => {
new NewLogRegisteredHandler();
});
return (
<DependencyInjectionContainer builder={buildDependencies}>
<BrowserRouter>
<div className="app">
<Header />
<Routes>
<Route path="/" element={<Home />} />
</Routes>
</div>
</BrowserRouter>
</DependencyInjectionContainer>
);
};
export default App;
Tu función buildDependencies puede ser algo así
import { register } from "ts-injecty";
import { useEventDispatcher } from "@codescouts/ui";
import { TestUseCase } from "./application/test-use-case";
import { useLogger } from "./infrastructure/services/LoggerService";
export const buildDependencies = (builder: typeof register) => {
return [
builder(useLogger.name).withDynamicValue(() => useLogger()).build(),
builder(useEventDispatcher.name).withDynamicValue(() => useEventDispatcher()).build(),
builder(TestUseCase).withDependency(useLogger.name).and(useEventDispatcher.name).build(),
];
}
y ahora cuando necesites resolver por ejemplo el caso de uso TestUseCase debes hacerlo así
import { useResolve } from "@codescouts/ui";
import { TestUseCase } from "@application/test-use-case";
export const Foo = ()=> {
const testUseCase = useResolve(TestUseCase);
}