什么是Injector
# 什么是 Injector
Injector 是代码实现的产物,并不是一定需要它,只不过有了 Injector 可以更好的组织代码。
就像桌子上摆放了一堆水果,我们不会说桌子上摆放了一堆苹果、梨子、香蕉、橘子、菠萝。因为这么说太过于啰嗦了。
提示
Injector 又叫作注入器、Container、依赖注入容器。
# 如果没有 Injector
回忆一下什么是 Provider中,我们主要是做了两件事。
第一件事是声明 providers,第二件事是获取服务对象。如果没有 Injector,我们可能需要定义这样的两个 API。
// 定义providers
const providers = [...]
// 声明providers
setProviders(providers);
// 获取服务对象
const someService = getService(SomeToken);
1
2
3
4
5
6
2
3
4
5
6
可以看出来这样的两个 API 显得比较分散,不够内聚。更加关键的问题是这样的实现隐含着全局只能有一个 providers。
就算我们把setProviders
实现成追加模式而不是替换模式。仍然改变不了全局只有一个 providers 的事实。
相反通过 Injector,可以让 API 更加内聚,而且我们可以实例化多个 injector 对象,然后组合这些 injector 对象形成一颗 injector 树。从而支持分级注入的特性。参考这里 (opens new window)以及参考这里 (opens new window)
// 注意这里只是伪代码,只是用于演示什么是分级注入特性
// 注意@kaokie/di中的Injector的实际用法和下面的Injector并不一致
const parentInjector = new Injector();
const childInjector = new Injector();
childInjector.parent = parentInjector;
parentInjector.defineKeyValue("tokenA", ClassA);
childInjector.defineKeyValue("tokenB", ClassB);
// 注意到childInjector中并没有定义tokenA,但是仍然可以获取到服务实例
const serviceA = childInjector.getValueByKey("tokenA");
const serviceB = childInjector.getValueByKey("tokenB");
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
编辑 (opens new window)
上次更新: 2023/08/22, 17:17:59