При использовании пользовательских HttpInterceptors в угловом 5+ я получаю следующее странное поведение инъекции зависимостей.
Следующий упрощенный код работает отлично:
export class AuthInterceptor implements HttpInterceptor {
constructor(private auth: AuthService) {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = this.auth.getToken();
return next.handle(req);
}
}
export class AuthService {
token: string;
constructor() {
console.log('AuthService.constructor');
}
}
ТЕМ НЕ МЕНИЕ....
Когда AuthService
имеет 1 или более зависимостей, например,
export class AuthService {
token: string;
constructor(private api: APIService) {
console.log('AuthService.constructor');
}
}
angular пытается многократно создавать новые экземпляры AuthService
пока я не получу следующие ошибки:
Журнал отображает сообщение AuthService.constructor
~ 400 раз
а также
Cannot instantiate cyclic dependency! HTTP_INTERCEPTORS ("[ERROR ->]"): in NgModule AppModule
а также
app.component.html: 44 ERROR RangeError: превышен максимальный размер стека вызовов
Затем я попытался использовать услугу с помощью класса Injector -
export class AuthService {
token: string;
api: APIService;
constructor(private injector: Injector) {
this.api = this.injector.get(APIService);
console.log('AuthService.constructor');
}
}
но получая ту же ошибку (максимальный размер стека вызовов).
APIService
- это простой сервис, который только вводит HttpClient
в свой конструктор.
@Injectable()
export class APIService {
constructor(private http: HttpClient) {}
}
Наконец, когда я AuthService
в Interceptor с помощью Injector
, ошибка исчезает, но AuthService создается 200+ раз:
export class AuthInterceptor implements HttpInterceptor {
auth: AuthService;
constructor(private injector: Injector) {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.auth = this.auth || this.injector.get(AuthService);
const token = this.auth.getToken();
return next.handle(req);
}
}
Рассматривая официальную документацию и другой пример, кажется, что технически возможно внедрить услуги в Http Interceptors. Есть ли какие-либо ограничения или любые другие настройки, которые могут отсутствовать?