Angular 2 将服务注入服务
Angular 2 inject service into service
在我的应用程序中,我使用我们自己的实现扩展了 Angular Http class,添加了一些 headers.
export class Secure_Http extends Http {
private getJwtUrl = environment.employerApiUrl + '/getJwt';
private refreshJwtUrl = environment.employerApiUrl + '/refreshJwt';
constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private storage: SessionStorageService) {
super(backend, defaultOptions);
}
然后,在 app.mobule.ts 文件中,我这样做了,所以每次都使用我们的安全版本而不是基本版本:
@NgModule({
declarations: [
AppComponent
],
imports: [
....
],
providers: [
....
SessionStorageService,
{
provide: Http,
useFactory: secureHttpFactory,
deps: [XHRBackend, RequestOptions, SessionStorageService]
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
export function secureHttpFactory(backend: XHRBackend, options: RequestOptions, sessionStorage: SessionStorageService) {
return new Secure_Http(backend, options, sessionStorage);
}
现在,在我们的服务中,我们使用标准 constructor/DI 方法:
@Injectable()
export class MySecurityService {
employerApiBaseUrl: string = environment.employerApiUrl;
constructor(private _http: Http) { } //, private _secureHttp: Secure_Http
getUser() : Observable<User> {
this.log('getUser', 'getting the current user');
var thisUrl = this.employerApiBaseUrl + '/jwt/userinfo';
var searchParam = {
jwt: this.getToken()
};
return this._http.post(thisUrl, searchParam)
.map((response: Response) => this.extractGetUserResponse(response))
.catch(this.handleError);
}
}
现在我的问题是,SecurityService 还需要注入 Secure_Http class/service 因为那里有一个函数需要获取 JWT。
但是,一旦我将 Secure_Http class/service 添加为构造函数参数,我就会收到错误 No provider for Secure_Http
.
因此,我的下一个想法是将 Secure_Http 添加到 app.module.ts 文件中的提供程序部分,就在我指定 Http 需要使用 Secure_Http 的位置旁边。但是一旦我这样做,我就会收到错误 No provider for ConnectionBackend
。如果我转身将 ConnectionBackend
添加到提供者中,那么 @NgModule 上会出现一个错误,说 Type 'typeof ConnectionBackend' is not assignable to type provider
.
我哪里错了?我只有 1 种方法需要直接在 Secure_Http class 上访问。这是必需的,因为它需要成为我的 post 调用之一的参数。我不能只从 Secure_Http service/class 调用它,因为参数已经传递...
如果明确要注入Secure_Http
,则需要提供
{
provide: Secure_Http,
useFactory: secureHttpFactory,
deps: [XHRBackend, RequestOptions, SessionStorageService]
},
{ provide: Http, useExisting: Secure_Http }
这种方式都会导致 Secure_Http
被注入
constructor(private _http: Http) { }
constructor(private _secureHttp: Secure_Http) {}
但是如果您知道 Http
注入 Secure_http
(正如您的配置所做的那样),您可以直接投射
private _http: SecureHttp;
constructor(http: Http) {
this._http = http as Secure_Http;
}
在我的应用程序中,我使用我们自己的实现扩展了 Angular Http class,添加了一些 headers.
export class Secure_Http extends Http {
private getJwtUrl = environment.employerApiUrl + '/getJwt';
private refreshJwtUrl = environment.employerApiUrl + '/refreshJwt';
constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private storage: SessionStorageService) {
super(backend, defaultOptions);
}
然后,在 app.mobule.ts 文件中,我这样做了,所以每次都使用我们的安全版本而不是基本版本:
@NgModule({
declarations: [
AppComponent
],
imports: [
....
],
providers: [
....
SessionStorageService,
{
provide: Http,
useFactory: secureHttpFactory,
deps: [XHRBackend, RequestOptions, SessionStorageService]
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
export function secureHttpFactory(backend: XHRBackend, options: RequestOptions, sessionStorage: SessionStorageService) {
return new Secure_Http(backend, options, sessionStorage);
}
现在,在我们的服务中,我们使用标准 constructor/DI 方法:
@Injectable()
export class MySecurityService {
employerApiBaseUrl: string = environment.employerApiUrl;
constructor(private _http: Http) { } //, private _secureHttp: Secure_Http
getUser() : Observable<User> {
this.log('getUser', 'getting the current user');
var thisUrl = this.employerApiBaseUrl + '/jwt/userinfo';
var searchParam = {
jwt: this.getToken()
};
return this._http.post(thisUrl, searchParam)
.map((response: Response) => this.extractGetUserResponse(response))
.catch(this.handleError);
}
}
现在我的问题是,SecurityService 还需要注入 Secure_Http class/service 因为那里有一个函数需要获取 JWT。
但是,一旦我将 Secure_Http class/service 添加为构造函数参数,我就会收到错误 No provider for Secure_Http
.
因此,我的下一个想法是将 Secure_Http 添加到 app.module.ts 文件中的提供程序部分,就在我指定 Http 需要使用 Secure_Http 的位置旁边。但是一旦我这样做,我就会收到错误 No provider for ConnectionBackend
。如果我转身将 ConnectionBackend
添加到提供者中,那么 @NgModule 上会出现一个错误,说 Type 'typeof ConnectionBackend' is not assignable to type provider
.
我哪里错了?我只有 1 种方法需要直接在 Secure_Http class 上访问。这是必需的,因为它需要成为我的 post 调用之一的参数。我不能只从 Secure_Http service/class 调用它,因为参数已经传递...
如果明确要注入Secure_Http
,则需要提供
{
provide: Secure_Http,
useFactory: secureHttpFactory,
deps: [XHRBackend, RequestOptions, SessionStorageService]
},
{ provide: Http, useExisting: Secure_Http }
这种方式都会导致 Secure_Http
被注入
constructor(private _http: Http) { }
constructor(private _secureHttp: Secure_Http) {}
但是如果您知道 Http
注入 Secure_http
(正如您的配置所做的那样),您可以直接投射
private _http: SecureHttp;
constructor(http: Http) {
this._http = http as Secure_Http;
}