角度 6 中单例服务的多个实例化



>我在根目录中提供了一个角度服务

import {Injectable} from "@angular/core";
import {BehaviorSubject} from "rxjs";
import {Admin} from "../models/admin.model";
import {AdminsService} from "./admins.service";
@Injectable({
providedIn: 'root'
})
export class CurrentUserService {
public user$: BehaviorSubject<Admin> = new BehaviorSubject(null);
constructor(private _adminsService: AdminsService) {
console.log('current user service instantiated');
this._adminsService.getCurrentUser()
.subscribe(user => {
this.user$.next(user);
});
}
public update() {
this._adminsService.getCurrentUser().subscribe(user => {
this.user$.next(user);
})
}
public clear() {
this.user$.next(null);
}
}

我以这种方式在app.module中提供它和Http拦截器:

providers: [
CurrentUserService,
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor,
multi: true
}
],

当我尝试将其注入拦截器时,我从构造函数那里收到了很多消息,这表明服务多次实例化。 任何人都可以解释这种行为,并且可能对如何解决它有一些想法?

带有消息屏幕截图的控制台

这是因为您在同一模块中多次提供相同的服务 -

首先由

@Injectable({
providedIn: 'root'
})

第二位

providers: [
CurrentUserService,
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor,
multi: true
}
],

最好从第一个中删除。

另一种选择是删除第二个声明。如果使用useExisting而不是useClass则框架不会创建类的新实例,而是尝试查找在第一个声明中创建的类的现有实例。

总之,您可以拥有

@Injectable({
providedIn: 'root'
})

和提供者为:

providers: [
CurrentUserService,
{
provide: HTTP_INTERCEPTORS,
useExisting: AuthInterceptor,
multi: true
}
],

最新更新