什么是Provider
# 什么是 Provider
在了解了什么是服务之后,Provider 非常容易理解。Provider 是一个对象,包含了服务名
和服务工厂
。
服务名又叫作服务标识符,或者叫作Token
。
服务工厂代表如何生产一个服务对象出来。
# 4 种不同的 Provider
const injector = new Injector([
SomeClass,
{
provide: someUseValueToken,
useValue: 'someValue',
},
{
provide: someUseClassToken,
useClass: SomeClass,
},
{
provide: someUseExistingToken,
useExisting: AnotherExistingToken,
},
{
provide: someUseFactoryToken,
useFactory: (dep1, dep2, dep3...) => {
return someValue
},
deps: [dep1Token, dep2Token, dep3Token...],
},
]);
const service1 = injector.get(SomeClass);
const service2 = injector.get(someUseValueToken);
const service3 = injector.get(someUseClassToken);
const service4 = injector.get(someUseExistingToken);
const service5 = injector.get(someUseFactoryToken);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
上面代码看似有 5 种不同的 Provider,是因为第一种的SomeClass
是一种简写的 Provider,完整版本的代码是这样的。
{
provide: SomeClass,
useClass: SomeClass,
}
1
2
3
4
2
3
4
也就是说 SomeClass 既可以作为服务名,又可以作为服务工厂。这也是用类来定义服务的优点。
Provider 中的 provide 参数代表服务名,服务名是用于后续获取服务时提供的参数,也就是injector.get(服务名)
。服务名基本可以是除了 Falsy 值以外的任意数据。常见的服务名有类,字符串,Symbol。
Provider 中的另一个useXXX
属性定义了服务工厂,也就是定义了如何来生产一个服务对象。
目前这 4 种 Provider 是完全参考的 Angular (opens new window) 的概念。
# useClass
useClass 属性一定是一个类,本库会采用new
关键字来生产一个服务对象。
# useValue
useValue 属性可以是任意数据,包括函数。因为它会直接返回该数据作为服务对象。
# useExisting
useExisting 属性一定是一个已经声明的服务名。它的作用是用这个新的服务名来生成一个服务对象。
# useFactory
useFactory 属性一定是一个函数,该函数的返回值作为服务对象。该函数可以有若干参数,参数需要通过deps
属性来定义,deps 是一个服务名数组。
编辑 (opens new window)
上次更新: 2023/08/22, 17:17:59