English | 한국어
Flex-Injector is a library that makes dependency injection easy. This library utilizes TypeScript's decorator feature to manage dependencies in a simple and clear way.
Using createInjector
, you can create multiple injectors and inject dependencies through different containers. This is particularly useful in a monorepo
environment. Each package or module can use an independent injector, making dependency management more efficient and clear.
- Install module:
npm install flex-injector
- Install peer dependencies:
npm install reflect-metadata
- tsconfig.json compilerOptions :
{
"emitDecoratorMetadata": true,
"experimentalDecorators": true
}
./service
├── todo.service.ts
├── user.service.ts
└── injector.ts
// ./service/injector.ts
import { createInjector } from 'flex-injector';
const { InjectAble, inject } = createInjector();
export { InjectAble, inject };
// ./service/todo.service.ts
import { InjectAble } from './injector';
@InjectAble
export class TodoService {
async getTodo(userId:string) {
return ...;
}
}
// ./service/user.service.ts
import { InjectAble } from './injector';
@InjectAble
export class UserService {
constructor(private todoService: TodoService) {}
async getTodo(userId:string) {
return this.todoService.getTodo(userId);
}
async find(userId:string) {
return ...;
}
}
// express server example
const userService = inject(UserService);
app.get('/todo', async (req, res) => {
const todoList = await userService.getTodo(req.session.userId);
res.json(todoList);
});
// Beware of circular reference errors. Below is a bad example where circular references occur.
const { inject, InjectAble } = createInjector();
@InjectAble
class A {
constructor(private b: B) {}
}
@InjectAble
class B {
constructor(private a: A) {}
}
const a = inject(A); // Throw Circular dependency detected