Таможенный сервис в расширенном 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 для подхода, как обойти циклическую зависимость.

Другие вопросы по тегам