【问题标题】:Custom ViewResolver and dependency injection自定义 ViewResolver 和依赖注入
【发布时间】:2016-07-07 21:02:36
【问题描述】:

我正在尝试创建一个自定义 ViewResolver 类(扩展 angular 的内置类),以使用自定义服务增强我系统的样式元数据(我正在从外部系统加载我的样式)。但是我遇到了依赖注入系统和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,因此我需要确保该提供程序也已定义并可用于注入器。

我希望所有这些服务都由引导程序“提供”,以便将来我可以在每个系统的基础上提供我的任何服务的替代版本。

作为参考,这是 Angular 的核心 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 ...
    }
}

【问题讨论】:

    标签: dependency-injection angular angular2-services


    【解决方案1】:

    您可以尝试使用useFactory 配置您的课程:

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

    【讨论】:

    • 谢谢,这很有魅力。它没有使用与我的主要引导应用程序相同的“提供者”堆栈,但我仍然可以覆盖该级别的依赖项,因此它适用于我的使用!再次感谢。
    猜你喜欢
    • 2017-05-04
    • 1970-01-01
    • 2014-01-30
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2012-11-12
    相关资源
    最近更新 更多