0

(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
    ) {...}
}

依存関係の例は次のとおりです。

依存関係 1.ts

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

私の質問は次のとおりです。なぜ、上記で、次のようなエラーが表示されるのですか No provider for PouchSync!?

次のように、 app.module.tsprovidersの配列にDependency1 と Dependency2 を追加することで問題を解決できます。

app.module.ts (固定)

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

export class AppModule {}

これは非常に醜いようです。これらの依存関係についてのみRootService知る必要があります。ここで何か間違ったことをしていますか?または、なぜこのようにしなければならないのか、誰かが説明できますか? 確かに、注入するときRootService、インジェクターはそれが依存していることを確認できるDependency1ためDependency2、それらも注入する必要があるため、アプリケーション全体のシングルトンにもなります。

4

2 に答える 2

1

サービスは components ではないため、 @Componentデコレータを使用できません(つまり、サービス クラスに providers 配列を追加することはできません)。結論?このコードは間違っています:

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

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

しかし、2番目の例は角度のある2つの方法で作成されています。

あなたは、RootService依存関係についてのみ知る必要があると書いています。したがって、これらの依存関係が再利用可能なオブジェクトではなく、アプリケーションのいくつかの部分に注入する必要がありますが、このクラスでしか利用できない場合 (!) - サービス内でそれらのインスタンスを作成するだけです。

于 2016-08-17T21:33:45.217 に答える