Angular 2-4 - 如何配置我的模块

时间:2017-06-21 08:53:11

标签: angular typescript dependency-injection

我不明白为什么我在服务中没有收到配置?

这是我的模块ScnApiModule

module.ts

@NgModule({
  imports: [
    CommonModule
  ],
  declarations: [],
  exports: []
})
export class ScnApiModule {
  static forRoot(config?: IApiConfig): ModuleWithProviders {
    console.log('ScnApiModule', config); // here I get the config

    return {
      ngModule: ScnApiModule,
      providers: [
        {provide: 'ApiConfig', useValue: config},
        RestService,
...

我的服务

rest.service.ts

@Injectable()
export class RestService {
  constructor(@Inject('ApiConfig') config?: IApiConfig) {
    console.log('RestService', config); // here I get `undefined`
...

主要应用模块

app.module.ts

export const CONFIG: IApiConfig = {
  apiHost: environment.scnApiLibrary.apiHost,
  authHost: environment.scnApiLibrary.authHost,
  clientId: environment.scnApiLibrary.clientId,
  secret: environment.scnApiLibrary.secret,
};

@NgModule({
...
imports: [
  ScnApiModule.forRoot(CONFIG)
]
...

我做错了什么?如何在服务中获取配置,然后初始化配置

1 个答案:

答案 0 :(得分:1)

首先使您的IApiConfig注入方式可被任何服务或组件访问

@Injectable()
export class IApiConfig {
    apiHost:string;
    authHost:string;
    clientId:string;
    secret:string;

    constructor(init?: Partial<IApiConfig>) {
       this.apiHost = init.apiHost;
       ...
    }
}

然后在你的ScnApiModule中,你将需要建立一个工厂来提供你的配置

export const apiConfigToken = new InjectionToken<IApiConfig>('apiConfigToken');

export function getapiConfigInjectionToken(config: IApiConfig) {
    return new IApiConfig(config);
}

export const APIConfigProvider = {
    provide: IApiConfig ,
    useFactory: getapiConfigInjectionToken,
    deps: [apiConfigToken]
};

改变提供方式

export class ScnApiModule {
  static forRoot(config?: IApiConfig): ModuleWithProviders {

    return {
      ngModule: ScnApiModule,
      providers: [
         {provide: apiConfigToken, useValue: config},
            APIConfigProvider,
...

用法

ScnApiModule.forRoot({apiHost: 123,authHost:456})