Skip to content

层次依赖注入系统

在大型项目中,一个注入器能做的事情较为有限,redi 允许你在多个注入器之间构建父子关系以形成层次依赖注入系统。

父子关系的创建

在两个注入器之间建立父子关系有两种方法,第一种是通过父注入器的 createChild 方法:

const parentInjector = new Injector([[PlatformService]])
const childInjector = parentInjector.createChild([[OrderService]]) // 传入子注入器的绑定

第二种是创建子注入器时将父注入器传递进去:

const parentInjector = new Injector([[PlatformService]])
const childInjector = new Injector([[OrderService]], parentInjector)

单向依赖查找

当子注入器无法解析标识符时,它将会调用其父注入器进行解析,如果父注入器不存在且该标识符对应的依赖是必须的才会抛出错误。下面的例子中,PlatformService 将会由 parentInjector 创建:

childInjector.get(PlatformService)

依赖查找控制

你可以控制依赖查找的过程,可以通过 SkipSelf 来跳过当前注入器,通过 Self 将查找过程限制在当前注入器。

class ChartComponent {
constructor(
@Self() @Inject(Container) private readonly selfContainer: Container,
@SkipSelf() @Optional(Container) private readonly parentContainer?: Container
) {}
}

SkipSelfSelf 同样可以用于工厂函数:

const dependencies = [
[Container],
[IChartComponent, {
useFactory: (parentContainer: Container, selfContainer: Container) => {
// ...
},
deps: [
[new SkipSelf(), Container],
[new Self(), Container],
]
}]
]