Angular中的StaticInjector与ReflectiveInjector

时间:2017-08-09 08:37:11

标签: angular dependency-injection angular-di

Angular 5.x将包含in this tweet所提及的新StaticInjector。我有两个问题:

  • 与现有的ReflectiveInjector有何不同?
  • 它会破坏我现有的任何代码吗?

1 个答案:

答案 0 :(得分:5)

首先,有一篇很棒的文章Angular introduces StaticInjector. Should you care?解释了细节上的差异。

  

它与现有的ReflectiveInjector有什么不同?

ReflectiveInjector

依赖Reflect库提供的反射功能来提取提供者的隐式依赖关系,因此名称为Reflective

class B {}
class A {
  constructor(@Inject(B) b) { } <----- `B` is implicit dependency
}

const i = ReflectiveInjector.resolveAndCreate([A, B]);

@Inject装饰器定义指定隐式依赖关系的元数据,ReflectiveInjector使用此元数据。

StaticInjector

不使用反射功能,需要明确指定依赖项:

class B {}
class A { constructor(b) {} }
const i = Injector.create([{provide: A, useClass: A, deps: [B]]};
const a = i.get(A);
  

它会破坏我现有的代码吗?   此更改将仅影响提供给平台和编译器提供程序的提供程序。所以如果你提供这样的话:

class B1 {}
class A1 { constructor(@Inject(B1) b) {} }

class B2 {}
class A2 { constructor(@Inject(B2) b) {} }
bootstrapModule(AppModule, {providers: [A1, B1]}).platformBrowserDynamic([A2, B2])

您现在应该将其更改为:

class B1 {}
class A1 { constructor(b) {} }

class B2 {}
class A2 { constructor(b) {} }

platformBrowserDynamic([{ provide: A1, useClass: A1, deps: [B1] }, B1])
.bootstrapModule(AppModule, { providers: [ {provide: A2, useClass: A2, deps: [B2]}, B2 ] })

ReflectiveInjector仍然标记为稳定,因此您可以继续使用它。但是很有可能它将来被删除。我建议你尽快开始使用StaticInjector