Angular 单例服务的新实例正在另一个单例服务中创建
New instance of Angular singleton service being created in another singleton service
我是 Angular 的新手,正在尝试弄清楚如何将我的 Angular 服务(游戏服务)注入另一个 angular 服务,该服务将成为解析器(游戏解析器) ).我的应用程序中通常只创建一个游戏服务实例,我成功地将它注入到我的每个组件中,但是当需要我的游戏解析器服务时,它会创建一个新的游戏服务实例,即使游戏服务是应该是单例。
我已经尝试在我的 NgModule 的 'providers' 数组中声明这两个服务,试图让它们成为单例服务,我还尝试了声明 'providedIn: 'root' 在 @Injectable 装饰器中,但在调用游戏解析器服务构造函数时会创建一个新的游戏服务实例。
//GameResolver.service.ts
@Injectable({
providedIn: 'root'
})
export class GameResolverService implements Resolve<Game> {
constructor(private gameService: GameService) {
}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Game> {
return this.gameService.getGameById(gameId)
}
}
//game-resolver.service.spec.ts
import { TestBed, inject } from '@angular/core/testing';
import { GameResolverService } from './game-resolver.service';
describe('GameResolverService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [GameResolverService]
});
});
it('should be created', inject([GameResolverService], (service: GameResolverService) => {
expect(service).toBeTruthy();
}));
});
//Game.service.ts
import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import { Game } from './game';
import { map } from "rxjs/operators";
import { User } from './user';
@Injectable({
providedIn: 'root'
})
export class GameService {
constructor(private http: Http) {
console.log('new instance of GameService created');
}
//app.module.ts
const appRoutes: Routes = [
...
{path:'game', component: GameComponent, data:{depth:3}, resolve: { game: GameResolverService}},
{path:'endGame', component: EndGameComponent, data:{depth:4}},
{path:'nextRound', component: NextRoundComponent, data:{depth:5}}
]
@NgModule({
declarations: [
...
],
imports: [
...
],
bootstrap: [AppComponent],
providers: [GameService, GameResolverService]
})
//create-game.component.ts
...
import {GameService} from '../game.service';
@Component({
selector: 'app-create-game',
templateUrl: './create-game.component.html',
styleUrls: ['./create-game.component.css'],
})
export class CreateGameComponent implements OnInit {
// @HostListener('window:popstate', ['$event'])
constructor(private gameService: GameService, private router: Router) {
}
//game.component.ts
@Component({
selector: 'app-game',
templateUrl: './game.component.html',
styleUrls: ['./game.component.css']
})
export class GameComponent implements OnInit {
game:Game;
constructor(private gameService: GameService, private router: Router, private socketService: SocketService, private route: ActivatedRoute ) {
this.game = this.route.snapshot.data['game']
}
}
我对 angular 依赖注入的层次结构有什么不理解的地方吗?我需要 GameService 成为跨应用程序所有部分的单例服务,因此我需要在不创建新实例的情况下将单例实例注入到 Game Resolver 服务中。
经过多次搜索,我终于意识到在我的 app.component.ts 文件中,我仍然在 @Component 装饰器中定义了 providers
数组,而我正在使用 providedIn: 'root'
方法。 Dzhavat Ushev 是对的,你不能同时使用这两个。我以为我已经摆脱了我所有的 providers
声明,但我不知道那里有一个。它现在完美运行。谢谢你们的帮助。
我是 Angular 的新手,正在尝试弄清楚如何将我的 Angular 服务(游戏服务)注入另一个 angular 服务,该服务将成为解析器(游戏解析器) ).我的应用程序中通常只创建一个游戏服务实例,我成功地将它注入到我的每个组件中,但是当需要我的游戏解析器服务时,它会创建一个新的游戏服务实例,即使游戏服务是应该是单例。
我已经尝试在我的 NgModule 的 'providers' 数组中声明这两个服务,试图让它们成为单例服务,我还尝试了声明 'providedIn: 'root' 在 @Injectable 装饰器中,但在调用游戏解析器服务构造函数时会创建一个新的游戏服务实例。
//GameResolver.service.ts
@Injectable({
providedIn: 'root'
})
export class GameResolverService implements Resolve<Game> {
constructor(private gameService: GameService) {
}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Game> {
return this.gameService.getGameById(gameId)
}
}
//game-resolver.service.spec.ts
import { TestBed, inject } from '@angular/core/testing';
import { GameResolverService } from './game-resolver.service';
describe('GameResolverService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [GameResolverService]
});
});
it('should be created', inject([GameResolverService], (service: GameResolverService) => {
expect(service).toBeTruthy();
}));
});
//Game.service.ts
import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import { Game } from './game';
import { map } from "rxjs/operators";
import { User } from './user';
@Injectable({
providedIn: 'root'
})
export class GameService {
constructor(private http: Http) {
console.log('new instance of GameService created');
}
//app.module.ts
const appRoutes: Routes = [
...
{path:'game', component: GameComponent, data:{depth:3}, resolve: { game: GameResolverService}},
{path:'endGame', component: EndGameComponent, data:{depth:4}},
{path:'nextRound', component: NextRoundComponent, data:{depth:5}}
]
@NgModule({
declarations: [
...
],
imports: [
...
],
bootstrap: [AppComponent],
providers: [GameService, GameResolverService]
})
//create-game.component.ts
...
import {GameService} from '../game.service';
@Component({
selector: 'app-create-game',
templateUrl: './create-game.component.html',
styleUrls: ['./create-game.component.css'],
})
export class CreateGameComponent implements OnInit {
// @HostListener('window:popstate', ['$event'])
constructor(private gameService: GameService, private router: Router) {
}
//game.component.ts
@Component({
selector: 'app-game',
templateUrl: './game.component.html',
styleUrls: ['./game.component.css']
})
export class GameComponent implements OnInit {
game:Game;
constructor(private gameService: GameService, private router: Router, private socketService: SocketService, private route: ActivatedRoute ) {
this.game = this.route.snapshot.data['game']
}
}
我对 angular 依赖注入的层次结构有什么不理解的地方吗?我需要 GameService 成为跨应用程序所有部分的单例服务,因此我需要在不创建新实例的情况下将单例实例注入到 Game Resolver 服务中。
经过多次搜索,我终于意识到在我的 app.component.ts 文件中,我仍然在 @Component 装饰器中定义了 providers
数组,而我正在使用 providedIn: 'root'
方法。 Dzhavat Ushev 是对的,你不能同时使用这两个。我以为我已经摆脱了我所有的 providers
声明,但我不知道那里有一个。它现在完美运行。谢谢你们的帮助。