私はシステムのスタイルメタデータをカスタムサービス(私は外部システムから自分のスタイルをロードしています)で補強するために、カスタムのViewResolver
クラス(角度の組み込みクラスを拡張)を作成しようとしています。しかし、私は依存注入システムとViewResolver
の問題に遭遇しています。カスタムViewResolverと依存性注入
Boot.ts:
bootstrap(App, [
MyStyleService, // my custom service
SomeOtherService, // another custom service used by MyStyleService
{
provide: ViewResolver,
useClass: MyViewResolver // my custom ViewResolver
}
])
MyViewResolver.ts:
@Injectable()
export class MyViewResolover extends ViewResolver {
constructor(
private _reflector: ReflectorReader,
// I want to reference 'StyleService' from the providers array in boot.ts
private _styleService: StyleService
) {
super(_reflector);
}
public resolve(comopnent: Type) {
let meta: ViewMetadata = super.resolve(component);
let styles = this._styleService.someMethod(meta);
}
}
は、私は次のように私のシステムのセットアップに何かを持っていますMyViewResolver
の中にthis._styleService
は注入されていません。現在はundefined
です。 MyStyleService
も別の注入サービスSomeOtherService
に依存することに注意してください。そのため、そのプロバイダも定義され、インジェクタで利用可能であることを確認する必要があります。
これらのサービスはすべてブートストラップによって「提供」されていますので、将来は私のサービスの代替バージョンをシステムごとに提供できます。参考のため
これはの角度中核ViewResolver
です:あなたはuseFactory
とあなたのクラスを設定しようとすることができ
import {Injectable, ViewMetadata, ComponentMetadata,} from '@angular/core';
import {ReflectorReader, reflector} from '../core_private';
import {Type, stringify, isBlank, isPresent} from '../src/facade/lang';
import {BaseException} from '../src/facade/exceptions';
import {Map} from '../src/facade/collection';
@Injectable()
export class ViewResolver {
constructor(private _reflector: ReflectorReader = reflector) {}
resolve(component: Type): ViewMetadata {
... stuff here ...
}
}
ありがとう、これは魅力的な仕事でした。メインのブートストラップされたAppと同じ "プロバイダ"スタックを使用していないが、そのレベルで依存関係を上書きできるので、私の使用にはうまくいきます!再度、感謝します。 – TimS