何らかのサービスが注入される必要がある一連の Angular2 コンポーネントがあります。最初に考えたのは、スーパークラスを作成してそこにサービスを注入するのが最善だということでした。すると、どのコンポーネントもそのスーパークラスを拡張することになりますが、この方法は機能しません。
簡略化された例:
export class AbstractComponent {
constructor(private myservice: MyService) {
// Inject the service I need for all components
}
}
export MyComponent extends AbstractComponent {
constructor(private anotherService: AnotherService) {
super(); // This gives an error as super constructor needs an argument
}
}
MyService
各コンポーネント内に挿入し、その引数を呼び出しに使用することでこの問題を解決できますsuper()
が、それは明らかに不合理です。
コンポーネントがスーパークラスからサービスを継承するように、コンポーネントを正しく構成するにはどうすればよいですか?
ベストアンサー1
各コンポーネント内に MyService を挿入し、その引数を super() 呼び出しに使用することでこの問題を解決できますが、これは明らかに不合理です。
それは不合理ではありません。これがコンストラクターとコンストラクター インジェクションの仕組みです。
すべての注入可能なクラスは、依存関係をコンストラクター パラメーターとして宣言する必要があり、スーパークラスにも依存関係がある場合は、これらもサブクラスのコンストラクターにリストし、呼び出しとともにスーパークラスに渡す必要がありますsuper(dep1, dep2)
。
インジェクターを渡して依存関係を強制的に取得することには、重大な欠点があります。
依存関係が隠されるため、コードが読みにくくなります。Angular2
DI の仕組みに精通している人の期待に反します。
静的コードを生成するオフライン コンパイルを中断して、宣言型および命令型の DI を置き換え、パフォーマンスを向上させ、コード サイズを削減します。