Angular 抽象单例服务
Angular abstract singleton service
出于测试目的,我创建了抽象服务以轻松切换 production/mockup 服务。但是我发现 providedIn: 'root'
没有按预期工作(创建了许多服务实例)。这里是摘要class
@Injectable({providedIn: 'root',})
export abstract class AbstractAuthService {
abstract loadUserProfile(): Observable<UserProfile>;
...
}
这是它的实现
@Injectable({ providedIn: 'root' })
export class AuthService implements AbstractAuthService {
time = 0;
constructor(private http: HttpClient) {
// code for detect how many instances are created
this.time = +new Date();
console.log('CONSTURCTOR', this.time);
}
loadUserProfile() { console.log('load profile', this.time); ... }
...
}
并在 app.module.ts
@NgModule({
...
providers: [
{ provide: AbstractAuthService, useClass: AuthService }
...
],
...
对于此代码,当我在浏览器中 运行 时(并在少数地方调用方法 loadUserProfile
),我看到
> CONSTURCTOR 1623167229573
> ...
> CONSTURCTOR 1623167229612
> ...
> load profile 1623167229573
> load profile 1623167229612
> load profile 1623167229573
> load profile 1623167229612
> ...
这意味着 angular 至少创建此服务的两个实例,并 运行 为每个 loadUserProfile
调用交替创建它们。我只想创建一个 - 单例 - 因为我在该服务上保存了 csrfToken 和其他身份验证数据。
怎么做?
我发现以下解决方案很简单,但是 'low readable' - 在 app.module.ts 中使用 useExisting
而不是 useClass
{ provide: AbstractAuthService, useExisting: AuthService }
出于测试目的,我创建了抽象服务以轻松切换 production/mockup 服务。但是我发现 providedIn: 'root'
没有按预期工作(创建了许多服务实例)。这里是摘要class
@Injectable({providedIn: 'root',})
export abstract class AbstractAuthService {
abstract loadUserProfile(): Observable<UserProfile>;
...
}
这是它的实现
@Injectable({ providedIn: 'root' })
export class AuthService implements AbstractAuthService {
time = 0;
constructor(private http: HttpClient) {
// code for detect how many instances are created
this.time = +new Date();
console.log('CONSTURCTOR', this.time);
}
loadUserProfile() { console.log('load profile', this.time); ... }
...
}
并在 app.module.ts
@NgModule({
...
providers: [
{ provide: AbstractAuthService, useClass: AuthService }
...
],
...
对于此代码,当我在浏览器中 运行 时(并在少数地方调用方法 loadUserProfile
),我看到
> CONSTURCTOR 1623167229573
> ...
> CONSTURCTOR 1623167229612
> ...
> load profile 1623167229573
> load profile 1623167229612
> load profile 1623167229573
> load profile 1623167229612
> ...
这意味着 angular 至少创建此服务的两个实例,并 运行 为每个 loadUserProfile
调用交替创建它们。我只想创建一个 - 单例 - 因为我在该服务上保存了 csrfToken 和其他身份验证数据。
怎么做?
我发现以下解决方案很简单,但是 'low readable' - 在 app.module.ts 中使用 useExisting
而不是 useClass
{ provide: AbstractAuthService, useExisting: AuthService }