Max*_*kyi 5 dependency-injection angular angular-di
Angular 5.x将包含本推文中StaticInjector提到的新内容.我有两个问题:
首先,有一篇很棒的文章Angular介绍了StaticInjector.你应该关心吗?这解释了细节上的差异.
它与现有的ReflectiveInjector有何不同?
依靠Reflect库提供的反射功能来提取提供者的隐式依赖关系,因此名称Reflective:
class B {}
class A {
constructor(@Inject(B) b) { } <----- `B` is implicit dependency
}
const i = ReflectiveInjector.resolveAndCreate([A, B]);
Run Code Online (Sandbox Code Playgroud)
所述@Inject装饰定义指定暗指的依赖元数据和ReflectiveInjector使用该元数据.
不使用反射功能并且需要明确指定依赖项:
class B {}
class A { constructor(b) {} }
const i = Injector.create([{provide: A, useClass: A, deps: [B]]};
const a = i.get(A);
Run Code Online (Sandbox Code Playgroud)
它会破坏我现有的代码吗?此更改将仅影响提供给平台和编译器提供程序的提供程序.所以如果你提供这样的话:
class B1 {}
class A1 { constructor(@Inject(B1) b) {} }
class B2 {}
class A2 { constructor(@Inject(B2) b) {} }
bootstrapModule(AppModule, {providers: [A1, B1]}).platformBrowserDynamic([A2, B2])
Run Code Online (Sandbox Code Playgroud)
您现在应该将其更改为:
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 ] })
Run Code Online (Sandbox Code Playgroud)
该ReflectiveInjector仍被标记为稳定,所以你也许可以继续使用它.但是很有可能它将来被删除.我建议你StaticInjector尽快开始使用.