Angular useValue vs useFactory

Angular useValue vs useFactory,angular,Angular,useValue和useFactory提供者之间有什么区别 似乎useFactory返回一个值,而useClass也返回相同的值。 useFactory接受一个工厂函数,该函数预期会返回值,也可能具有依赖项(需要将其他提供程序的实例作为参数传递) 例如,请参见中工厂功能所需的config:ConfigService参数 useValue只是按原样注入的值 useClass需要一个类型名,并从传递的类型创建实例,还解析构造函数参数并将其传递给类(如果有) 还有useExisting,它类似于已

useValue
useFactory
提供者之间有什么区别

似乎
useFactory
返回一个值,而
useClass
也返回相同的值。

  • useFactory
    接受一个工厂函数,该函数预期会返回值,也可能具有依赖项(需要将其他提供程序的实例作为参数传递)
例如,请参见中工厂功能所需的
config:ConfigService
参数

  • useValue
    只是按原样注入的值

  • useClass
    需要一个类型名,并从传递的类型创建实例,还解析构造函数参数并将其传递给类(如果有)

  • 还有
    useExisting
    ,它类似于已注册提供商的别名。用例是为同一个提供者实例提供不同的密钥


请参阅以获取示例。

使用值:
将为您提供的任何已分配对象实例分配当前值

useFactory
它也可以执行相同的操作,您可以根据
函数
中的其他依赖项配置factory对象,然后再返回其实例

{ 
  provide: CustomDependency,
  useFactory: () => {
    if (IS_A) {
      return new A();
    } else {
      return new B();
    }
  }
}
您可以使用
useFactory
配置依赖项 在配置时。与
config
phase Angular 1相同, 根据需要修改或形成依赖项的位置


我的基本理解

您可以将is
useValue
大致看作静态赋值;提供程序遵循以下接口:

假设您在使用
@Inject(INJECTION\u TOKEN)
时总是需要值
'12345'
,那么这将起作用

providers: [
  {
    provide: INJECTION_TOKEN,
    useValue: '12345',
  },
],
当使用
@Inject(INJECTION\u令牌)
时,它将始终返回“1234”

鉴于

providers: [
  {
    provide: INJECTION_TOKEN,
    useValue: () => '12345',
  },
],
将为注入令牌提供一个函数,该函数将返回“12345”

useFactory
期望函数产生注入值。工厂函数的返回值就是注入的值。此,
useFactory
提供程序类型使用。可以添加一个可选的
deps
数组,允许将参数传递给工厂函数

最后,
useClass

将注入器配置为返回令牌的useClass实例。[1]

注入器将提供所提供类的实例。值得注意的是,注入器还将在
ClassProvider
[1]界面上提供字段的值类型
useClass
的注入依赖项

总之,选择
useValue
每次提供相同的注入值*,
useFactory
当注入值应在运行时计算,以及
useClass
当您希望注入器构造
类型的值时