私はインターフェイス用に2つの実装を作成し、それらの実装を2つの異なるコンポーネントのプロバイダとして提供しました。このエラーが発生しました。エラー:ChildComponentのすべてのパラメータを解決できません:(?)。角2 - DIが動作しない
どこが間違っていますか?
interface MyInterface {
log(msg: string): void
}
class DebugService implements MyInterface {
public log(msg:string) {
console.debug(msg);
}
}
class ErrorService implements MyInterface {
public log(msg: string) {
console.error(msg);
}
}
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: '<div (click)="log()">Root Component</div><my-child></my-child><my-child></my-child>' //app/app.component.html
, providers: [DebugService]
})
export class AppComponent {
private dummy: MyInterface;
constructor(d: MyInterface) {
this.dummy = d;
}
log() {
this.dummy.log("Root");
}
}
@Component({
selector: 'my-child',
template: `<h4 (click)="log()"> Hello Child</h4>`,
providers: [ErrorService]
})
export class ChildComponent {
private dummy: MyInterface;
constructor(d: MyInterface) {
this.dummy = d;
}
log() {
this.dummy.log("Child");
}
}
これは正しくありません。 [@angularドキュメント](https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#injectable)にあるように、DIが動作するためには@Injectable()*が必要です。 @Injectable()としてマークされていないクラスをインスタンス化しようとすると、インジェクタはエラーを報告します。_ – nickspoon
@nickspoon - anあなたが提供したドキュメントのリンクから抽象的に、「依存関係を持たず、技術的に必要としないものであっても、すべてのサービスクラスにInjectable()を追加することをお勧めします。注入可能なデコレータは、サービスが他のサービスに依存している場合にのみ必要です。 Angularドキュメンテーションは、必須ではないが、サービスクラスの依存関係がなくても、Injectable()を使ってサービスクラスを修飾するのは "規約"です。 – user1176058
申し訳ありませんが、あなたが正しいです、私はちょうどテストし、依存関係のないサービスは '@Injectable()'なしで注入できます。あなたの質問に対する答えは、あなたが私の答えで言ったように、あなたの具体的なサービスを注入する必要があり、この例で '@Injectable()'を使用することは、ベストプラクティスにすぎません。 – nickspoon