Angular 5.x将包括本推文中提到的新StaticInjector
。我有两个问题:
- 它与现有的反射式喷油器有何不同?
- 它会破坏我现有的任何代码吗?
首先,有一篇很棒的文章 Angular 介绍了 StaticInjector。你应该关心吗?这解释了细节上的差异。
它与现有的反射式喷油器有何不同?
反射式喷油器
依靠库提供的反射功能来提取提供程序Reflect
隐式依赖项,因此名称为Reflective
:
class B {}
class A {
constructor(@Inject(B) b) { } <----- `B` is implicit dependency
}
const i = ReflectiveInjector.resolveAndCreate([A, B]);
@Inject
修饰器定义指定隐式依赖项的元数据,ReflectiveInjector
使用此元数据。
静态喷油器
不使用反射功能,需要显式指定依赖项:
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
可用时立即开始使用它。