2016-07-07 17 views
1

Ich versuche, eine benutzerdefinierte ViewResolver Klasse zu erstellen (Erweiterung von eckigen integrierten Klasse), um die Stil-Metadaten meines Systems mit einem benutzerdefinierten Service zu erweitern (ich lade meine Stile von externen Systemen). Allerdings stoße ich auf ein Problem mit dem Dependency-Injection-System und ViewResolver.Benutzerdefinierte ViewResolver und Abhängigkeitsinjektion

Ich habe mein System-Setup etwas wie folgt aus:

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); 
    } 
} 

Jedoch innerhalb MyViewResolver, this._styleService wurde nicht injiziert und ist derzeit undefined. Es sollte beachtet werden, dass MyStyleService auch von einem anderen injizierten Service SomeOtherService abhängt, also muss ich sicherstellen, dass dieser Provider auch für den Injektor definiert und verfügbar ist.

Ich möchte, dass alle diese Dienste vom Bootstrap "bereitgestellt" werden, sodass ich in Zukunft alternative Versionen meiner Dienste pro System bereitstellen kann.

Als Referenz ist diese Winkelkern ViewResolver:

view_resolver.ts (Angular2 Kern):

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

Antwort

2

Sie könnten versuchen, die Klasse mit useFactory zu konfigurieren:

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

Danke, das hat einen Reiz bewirkt. Es verwendet nicht den gleichen "Provider" -Stack wie meine Haupt-Bootstrap-App, aber ich kann immer noch Abhängigkeiten auf dieser Ebene überschreiben, also funktioniert es für mich! Danke noch einmal. – TimS

Verwandte Themen