inject-js
一个极简的 TypeScript 依赖注入框架。https://searchfe.github.io/inject-js/
安装
使用 npm 来安装:
npm install --save @searchfe/inject-js
inject-js 需要 Reflect Metadata 来在运行时决定依赖类型,你的 tsconfig.json
需要包含以下的设置:
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
另外因为该库依赖 Reflect 的使用,确保运行时存在 Reflect API 的 Polyfill,比如以下之一:
使用
以下是一些使用案例,更多细节请参考 API 文档。
@injectable
用 @injectable
来装饰一个 Service,这样 inject-js 就可以(借由 metadata)得知它的依赖并在运行时注入。
import { injectable } from 'inject-js';
import { Wheel } from './wheel';
@injectable
export class Car {
constructor(private wheel: Wheel) {}
}
import { injectable } from 'inject-js';
@injectable
export class Wheel {
constructor() {}
}
import { Container } from 'inject-js';
import { Car } from './car';
import { Wheel } from './wheel;
const di = new Container();
di.addService(Car);
di.addService(Wheel);
const car = di.create(Car);
@inject
用 @inject(token)
来装饰一个依赖(构造参数),来指定被注入的类。token
即为当前容器内 Provider 的唯一标识。
用于没有 Service 声明的场景(只有 Provider),或者没有 Metadata API 支持的场景。
也就是说借此可以在 JavaScript 代码中使用 inject-js。
import { inject } from 'inject-js';
import { Wheel } from './wheel';
@injectable
export class Car {
constructor(@inject('Wheel') private wheel: Wheel) {}
}
import { Container } from 'inject-js';
import { Car } from './car';
import { Wheel } from './wheel';
const di = new Container();
di.addService('Wheel', Wheel);
di.addService(Car);
const car = di.create(Car);
@service
如果 Container 实例就在定义 Service 的上下文中,可以用 @service 装饰器来直接注册:
const container = new Container();
@service(container)
class FooService {}
const container = new Container();
@injectable
class FooService {}
container.addService(FooService)
Container
Container 会维护一个 Providers 集合,以及每个 Provider 对应的 Token。需要创建实例时,会根据 Token 查找对应的 Provider 并进行创建。
我们提供了如下几种注册 Provider 的方式:
示例
在 demo 下包含了一个使用 inject-js 的示例。可以按以下步骤执行该示例:
- 进入 inject-js 项目根目录。
- 构建 inject-js:
npm install && npm run build
。 - 执行 demo:
npm run demo
。