2016-07-07 69 views
1

我試圖創建一個自定義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,所以我需要確保該提供者也被定義並可用於注入器。

我希望所有這些服務都由bootstrap「提供」,以便將來我可以在每個系統的基礎上提供我的任何服務的備用版本。

供參考,這是角的核心ViewResolver

view_resolver.ts(Angular2核心):

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 ... 
    } 
} 

回答

2

你可以嘗試用useFactory配置類:

bootstrap(App, [ 
    MyStyleService, 
    SomeOtherService, 
    { 
    provide: ViewResolver, 
    useFactory: (_reflector: ReflectorReader, styleService: StyleService) => { 
     return MyViewResolver(_reflector, _styleService); 
    }, 
    deps: [ ReflectorReader, StyleService ] 
    } 
]); 
+0

謝謝,這工作的魅力。它沒有使用與我的主引導應用程序相同的「提供程序」堆棧,但我仍然可以覆蓋該級別的依賴關係,因此適用於我的使用!再次感謝。 – TimS