Таможенный сервис в расширенном http не впрыскивается
Я хочу продлить Http
провайдер для перехвата всех запросов, которые предоставляют статус 403 для обработки автоматического выхода из системы. Мой обычай InterceptingHttp
должен быть объявлен как Http
провайдер, поэтому мне не нужно заботиться о "специальном" http провайдере.
Я должен следующее:
Мой пользовательский провайдер Http
import { Injectable } from '@angular/core';
import { Request, XHRBackend, RequestOptions, Response, Http, RequestOptionsArgs } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { AuthenticationService } from './../services/authentication.service';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
@Injectable()
export class InterceptingHttpService extends Http {
constructor(backend: XHRBackend, defaultOptions: RequestOptions, private authenticationService: AuthenticationService) {
super(backend, defaultOptions);
}
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
var self = this;
return super.request(url, options).catch((res: Response) => {
if (res.status === 403) {
console.log('intercepted');
self.authenticationService.logout();
}
return Observable.throw(res);
});
}
}
Объявление в качестве обычного провайдера Http в NgModule
@NgModule({
imports: [
BrowserModule,
ToastyModule.forRoot(),
HttpModule,
FormsModule,
routing,
Ng2BootstrapModule,
PaginationModule
],
declarations: [
AppComponent,
NavHeaderComponent,
FooterCopyrightComponent,
InventoryRootComponent,
InventoryTreeComponent,
InventoryDetailComponent,
SetModelComponent,
MetadataListComponent,
MetadataDetailComponent,
ScriptGeneratorComponent,
SetDetailComponent,
SetVersionComponent,
SetContainerTreeComponent,
SetContainerDetailComponent,
FilterByPropertyPipe,
OrderContainersByLeafPipe,
ResolveStateId,
ConfirmComponent,
FocusDirective
],
providers: [
SetService,
SetTypeService,
SetContainerService,
StateService,
NotificationService,
MetadataService,
MetadataTypeService,
EntityService,
SetContainerMetadataService,
AuthenticationService,
InterceptingHttpService,
ConfirmService,
SiteVersionService,
{
provide: Http,
useFactory: (backend: XHRBackend, defaultOptions: RequestOptions, authenticationService: AuthenticationService) => {
return new InterceptingHttpService(backend, defaultOptions, authenticationService);
},
deps: [XHRBackend, RequestOptions, AuthenticationService]
},
],
bootstrap: [AppComponent]
})
Он загружается и перехватывает все 403 ответа. Единственная странность в том, что authenticationService
не определено
Я думаю, что я, вероятно, сделал ошибку в моей декларации провайдеров. Я пытался добавить AuthenticationService
к deps
массив, который только привел к Циркулярной ошибке зависимости.
Где моя ошибка? Как я могу использовать мой AuthenticationService
в моем расширенном провайдере Http?
1 ответ
Вам нужно добавить AuthenticationService
в deps
deps: [XHRBackend, RequestOptions, AuthenticationService]
когда Http
вводится в AuthenticationService
это вызовет круговую зависимость, которую DI не может разрешить.
Посмотрите DI с циклической зависимостью с настраиваемым HTTP и ConfigService для подхода, как обойти циклическую зависимость.