useValue vs useFactory

时间:2016-11-21 14:22:10

标签: angular

sudo apt-get install nginx-extras-dbguseValue提供商之间有什么区别?

似乎useFactory返回一个值,useFactory也会返回一个值。

3 个答案:

答案 0 :(得分:16)

  • useFactory接受一个工厂函数,该函数应该返回该值,并且还可以具有依赖项(需要将其他提供程序的实例作为参数传递)

例如,请参阅How to pass parameters rendered from backend to angular2 bootstrap method

中工厂函数所需的config:ConfigService参数
  • useValue只是按原样注入的值

  • useClass需要一个类型名称,Angular会根据传递的类型创建一个实例,如果有任何

  • ,它还会解析并将构造函数参数传递给该类
  • 还有useExisting,它类似于已注册的提供商的别名。用例是为提供者提供不同密钥的相同实例。

有关示例,请参阅Angular 2 useExisting providers

答案 1 :(得分:10)

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

useFactory它也是一样的,您可以在function内部基于其他依赖项配置工厂对象,然后再返回它的实例。

{ 
  provide: CustomDependency,
  useFactory: () => {
    if (IS_A) {
      return new A();
    } else {
      return new B();
    }
  }
}
  

您可以使用useFactory配置您的依赖项   在配置时。与config阶段Angular 1的相同,   你正在修改或形成依赖的地方。

答案 2 :(得分:1)

我的基本理解...

您可以认为useValue大致上是静态分配;提供商遵循ValueProvider界面:

鉴于您在使用'12345'时总是想要值@Inject(INJECTION_TOKEN),那么它将起作用,

providers: [
  {
    provide: INJECTION_TOKEN,
    useValue: '12345',
  },
],

使用@Inject(INJECTION_TOKEN)时,它将始终返回'1234'。

鉴于,

providers: [
  {
    provide: INJECTION_TOKEN,
    useValue: () => '12345',
  },
],

将为INJECTION_TOKEN提供一个函数,该函数将返回“ 12345”。

useFactory需要一个函数来产生注入值。工厂函数的返回值是注入的值。 useFactory个提供者类型使用FactoryProvider interface。可以添加deps的可选数组,以允许将参数传递给工厂函数。

最后,useClass

配置Injector返回令牌的useClass实例。 [1]

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

总结一下,选择useValue每次提供相同的注入值*,useFactory应当在运行时计算注入值,而useClass则要构造注射器值Type<any>来提供。

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

[1] ClassProvider