将自定义服务注入自定义服务

时间:2016-05-08 03:25:23

标签: dependency-injection angular

使用Angular2 RC1

假设我有两个自定义服务:例如ConfigService和AuthService。

并且还假设AuthService需要来自ConfigService的数据。

ConfigService就是那样

import { Injectable } from '@angular/core';

@Injectable()
export class ConfigService {

   public baseURL: string; 

   constructor() {
      this.baseURL = 'http://localhost:8080';
   }
}

我的ConfigService必须是一个单例,所以我在我的引导程序提供程序数组中声明它:

bootstrap(MyWayAppComponent, [
  HTTP_PROVIDERS,
  ...
  ConfigService
]);

当我尝试在任何组件中注入我的ConfigService时没问题,我总是获取相同的实例。

但是现在我想在我的AuthService中注入这个ConfigService(AuthService不是单例并且在我的auth组件中提供)

我在我的AuthService中注入了ConfigService,如下所示:

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { ConfigService } from '../services/ConfigService';

@Injectable()
export class AuthService {

    constructor(private http: Http, private configService: ConfigService) {
    }
}

响应是:

EXCEPTION: Error: Uncaught (in promise): EXCEPTION: Error in :0:0
ORIGINAL EXCEPTION: No provider for ConfigService!
ORIGINAL STACKTRACE:
Error: DI Exception
at NoProviderError.BaseException [as constructor] (http://localhost:4200/vendor/@angular/core/src/facade/exceptions.js:17:23)
at NoProviderError.AbstractProviderError [as constructor] (http://localhost:4200/vendor/@angular/core/src/di/reflective_exceptions.js:39:16)
at new NoProviderError (http://localhost:4200/vendor/@angular/core/src/di/reflective_exceptions.js:75:16)
at ReflectiveInjector_._throwOrNull (http://localhost:4200/vendor/@angular/core/src/di/reflective_injector.js:776:19)
at ReflectiveInjector_._getByKeyDefault (http://localhost:4200/vendor/@angular/core/src/di/reflective_injector.js:804:25)
at ReflectiveInjector_._getByKey (http://localhost:4200/vendor/@angular/core/src/di/reflective_injector.js:767:25)
at ReflectiveInjector_.get (http://localhost:4200/vendor/@angular/core/src/di/reflective_injector.js:576:21)
at ElementInjector.get (http://localhost:4200/vendor/@angular/core/src/linker/element_injector.js:23:48)
at ElementInjector.get (http://localhost:4200/vendor/@angular/core/src/linker/element_injector.js:23:48)
at ReflectiveInjector_._getByKeyDefault (http://localhost:4200/vendor/@angular/core/src/di/reflective_injector.js:801:24)
ERROR CONTEXT:
[object Object]

我仔细阅读了优秀的Pascal Precht文章,但我不知道我错在哪里...... http://blog.thoughtram.io/angular/2015/09/17/resolve-service-dependencies-in-angular-2.html

注意:如果我的AuthService我尝试注入“常规”服务(如http)我没有pb ...所以我应该忘记我的服务声明中的内容但是????

1 个答案:

答案 0 :(得分:0)

只能在引导应用程序或组件级别时定义提供程序。

因此,您可以在此级别定义ConfigService。

有关详细信息,请参阅此问题:

关于AuthService,我不知道你如何定义它的提供者,但如果你利用useFactory,你需要显式定义它的依赖(包括ConfigService)。这是àpample:

provide(AuthService, {
  useFactory: (config) => {
    return new... 
  },
  depend: [ ConfigService ]
});