0

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

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

app.module.ts

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

export class AppModule {}

根服务.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
    ) {...}
}

一个依赖的例子是:

依赖1.ts

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

我的问题是:为什么,在上述情况下,我会收到一个错误消息: No provider for PouchSync!.

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

app.module.ts(固定)

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

export class AppModule {}

这看起来很丑陋。只RootService需要了解这些依赖关系。我在这里做错了吗?或者有人可以解释为什么必须这样吗?当然,在注入时RootService,注入器可以看到它依赖于它Dependency1Dependency2因此也必须注入它们,因此它们也将是应用程序范围的单例。

4

2 回答 2

1

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

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

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

但是您的第二个示例是以 Angular 2 方式制作的。

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

于 2016-08-17T21:33:45.217 回答
0

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

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

任何注入器都不会通过仅添加 RootService 来自动添加 Dependency1 和 Dependency2。它们必须专门添加到提供者数组中

于 2016-08-17T23:07:41.203 回答