Angular 通过构造器参数与喷油器服务进行喷油
我现在使用Angular2/4已经有几个月了,但我仍然不知道这两种方法之间有什么区别,我应该使用哪一种方法来进行依赖注入 你能帮帮我吗 第一种方法:通过构造函数 及 第二种方法:通过喷油器 我理解每种方法的作用,但我无法找出最佳实践 我知道这可能是一种主观观点,但我认为两者都有利弊Angular 通过构造器参数与喷油器服务进行喷油,angular,dependency-injection,Angular,Dependency Injection,我现在使用Angular2/4已经有几个月了,但我仍然不知道这两种方法之间有什么区别,我应该使用哪一种方法来进行依赖注入 你能帮帮我吗 第一种方法:通过构造函数 及 第二种方法:通过喷油器 我理解每种方法的作用,但我无法找出最佳实践 我知道这可能是一种主观观点,但我认为两者都有利弊 感谢您的解释。您应该始终选择第一个选项: ... constructor( private myService: MyService ) { // this.myService.myMeth
感谢您的解释。您应该始终选择第一个选项:
...
constructor(
private myService: MyService
) {
// this.myService.myMethod() ...
}
...
第二种方法有效,因为当您注入MyService
时,它是使用Injector
注入的
Angular使喷油器可用于喷油,因为在动态实例化模块或组件时可能需要使用它:
组成部分:
export class ModuleLoaderComponent {
constructor(private _injector: Injector,private loader: NgModuleFactoryLoader) { ... }
ngAfterViewInit() {
this.loader.load('app/t.module#TModule').then((factory) => {
const module = factory.create(this._injector); <-----------------
您可以在以下文章中阅读有关动态实例化的更多信息:
正如@estus所指出的,
injector
也用于在构造函数中注入依赖项会导致循环依赖的情况,或者您希望根据某些条件获得依赖项。我被告知,通常最好使用构造函数方法进行依赖项注入。它准确地告诉您这个类需要什么
另一方面,在某些情况下,最好使用喷油器。除了动态实例化之外,还必须考虑类继承,假设要从基于服务的S2的基础组件构建组件,该服务也是基于其他服务S1的。也就是C1(S1)中的C2(S2)
通常,C2使用super实例化C1,看起来像这样
constructor(
private service2: S2
) {
super(S1)
}
我发现必须调用父服务S1和S2才能构建C2存在问题。如果S1使用注入器方法,那么它就不会那么纠结了,这样写C2就和
constructor(
private injector: Injector
) {
super()
this.service2 = this.injector.get(S2)
}
private service2: S2
如果您想放弃构造函数中的设置实例,可以进一步创建自己的注入器单例。看见
您的第二种方法同时具有这两种功能;喷油器通过喷油器提供。还要注意的是,文档告诉您:我不是DI方面的专家,而是第一种方法,当我们创建
组件
实例时,通过键入构造函数
参数,查找此
组件所需的依赖项。这对于许多情况都是好的,但在第二种方法中,您将注入整个DI容器
,其中包括所有服务,但并非所有情况下都需要。请检查这个@jornsharpe。Thx,你的链接很有帮助。@N.HariHaraSudhan:谢谢,我不确定这是否有真正的区别,因为所有内容都是通过引用传递的,不是吗?但我认为你是对的:第一种方法更好。。。原因很简单,通过观察构造函数,您可以快速判断需要哪些依赖项。还应该注意,injector
用于在构造函数中注入dep导致循环依赖项的情况。类似于。对于根据某些条件动态获取dep也很有用。@AngularInDepth.com,从性能角度来看,始终第一种方法是正确的,因为注入注入器将导致创建当前组件不需要的所有服务,如果我错了请纠正我?@estus OK,但是循环依赖关系是糟糕的项目结构的证明,没有?@N.HariHaraSudhanInjector将导致创建当前组件不需要的所有服务。Angular将只为视图创建注入器的新实例包装器
export class RouterConfigLoader {
load(parentInjector, route) {
...
const modFactory = this.loadModuleFactory(route.loadChildren);
const module = modFactory.create(parentInjector);
}
constructor(
private service2: S2
) {
super(S1)
}
constructor(
private injector: Injector
) {
super()
this.service2 = this.injector.get(S2)
}
private service2: S2