Angular 2 Hierarchical Dependency Injection - 声明根提供者在root之外的依赖关系?

时间:2016-08-17 20:56:38

标签: angular typescript dependency-injection angular2-di

(注意我使用的是Angular 2 RC5)

为简单起见,我有一个类似的应用程序:

app.module.ts

@NgModule({
    providers: [
        RootService
    ],
    entryComponents: [AppComponent],
    bootstrap: [AppComponent]
})

export class AppModule {}

root.service.ts

import Dependency1 from './somewhere'
import Dependency2 from './somewhere-else'

@Component({
    providers: [Dependency1, Dependency2]
})

@Injectable()
export class RootService {
    constructor(
        private dep1: Dependency1, 
        private dep2: Dependency2
    ) {...}
}

依赖的一个例子是:

dependency1.ts

@Injectable()
    export class Dependency1{
    public doGroundbreakingSciencyStuff() {...}
}

我的问题是:为什么,如上所述,我遇到一个错误说: No provider for PouchSync!

我可以通过向 app.module.ts 中的providers数组添加Dependency1和Dependency2来解决问题,如下所示:

app.module.ts (已修复)

@NgModule({
    providers: [
        RootService,
        Dependency1,
        Dependency2
    ],
    entryComponents: [AppComponent],
    bootstrap: [AppComponent]
})

export class AppModule {}

这看起来非常难看。只有RootService需要知道这些依赖关系。我在这里做错了吗?或者有人可以解释为什么它必须这样?当然,当注入RootService时,注射器可以看到它依赖于Dependency1Dependency2,因此也必须注射它们,因此它们也会被应用广泛的单身人士。

2 个答案:

答案 0 :(得分:1)

服务不是组件,因此他们不能拥有 @Component 装饰器(这意味着 - 无法为服务类添加提供者数组)。结论?这段代码错了:

@Component({
    providers: [PouchSync, PouchArraySync]
})

@Injectable()
export class RootService {
    constructor(
        private dep1: Dependency1, 
        private dep2: Dependency2
    ) {...}
}

但你的第二个示例是以角度2方式制作的。

您写道,只有RootService需要了解依赖关系。因此,如果这些依赖项不是可重用对象,应该在应用程序的几个部分中注入,但只能在此类中使用(!) - 您应该只在服务中创建它们的实例。

答案 1 :(得分:0)

您要在应用程序中使用的任何服务都必须添加到providers数组中。向根ngModule添加服务实际上使它们在整个应用程序中可用。

当你说的时候 "当然,在注入RootService时,注入器可以看到它依赖于Dependency1和Dependency2,因此也必须注入它们,因此它们也是应用程序范围的单例"。

没有注入器只会通过添加RootService自动添加Dependency1和Dependency2。它们必须专门添加到提供者数组