useValue vs useFactory

Ign*_*rew 18 angular

useValueuseFactory提供者有什么区别?

它似乎useFactory返回一个值,useClass也是一样的.

Gün*_*uer 19

  • useFactory 采用预期返回值的工厂函数,也可以具有依赖项(需要作为参数传递的其他提供程序的实例)

例如,参见如何将从后端渲染的参数传递给angular2 bootstrap方法中config:ConfigService的工厂函数所需的参数

  • useValue 只是按原样注入的值

  • useClass 期望一个类型名称,Angular从传递的类型创建一个实例,并解析并将构造函数参数传递给类,如果有的话

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

有关示例,请参阅Angular 2使用现有提供程序.


Pan*_*kar 13

useValue: 将分配当前您提供的任何已分配对象实例.

useFactory:它也是这样做的,您可以function在返回其实例之前和之前基于其他依赖项配置工厂对象.

{ 
  provide: CustomDependency,
  useFactory: () => {
    if (IS_A) {
      return new A();
    } else {
      return new B();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用useFactory在配置时配置依赖项.它与config阶段Angular 1相同,您可以根据需要修改或形成依赖关系.


shw*_*ard 6

我的基本理解...

你可以useValue大致认为是静态赋值;Provider 遵循ValueProvider接口:

鉴于您'12345'在使用时始终想要该值@Inject(INJECTION_TOKEN),那么这将起作用,

providers: [
  {
    provide: INJECTION_TOKEN,
    useValue: '12345',
  },
],
Run Code Online (Sandbox Code Playgroud)

使用时,这将始终返回“1234” @Inject(INJECTION_TOKEN)

然而,

providers: [
  {
    provide: INJECTION_TOKEN,
    useValue: () => '12345',
  },
],
Run Code Online (Sandbox Code Playgroud)

INJECTION_TOKEN将提供一个返回“12345”的函数。

useFactory期望函数产生注入的值。工厂函数的返回值就是注入的内容。这个,useFactoryprovider类型使用FactoryProvider接口。可以添加一个可选数组deps,以允许将参数传递给工厂函数。

最后,useClass

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

注入器将提供所提供类的实例。值得注意的是,注入器还将在[1] 接口上提供Type<any>字段的值类型的注入依赖项。useClassClassProvider

总而言之,当应在运行时计算注入值时,以及当您希望注入器构造要提供的值时,请useValue选择每次*提供相同的注入值。useFactoryuseClassType<any>

* 注意:提供的值useValue可以是一个函数,因此如果调用注入的值,则可以生成动态值,因为它是一个函数。

[1]类提供者