PlayerCollection)。目前我只是创建两个单独的集合并使用-6ren">
gpt4 book ai didi

Angular2 "Services"如何将一项服务@inject 到另一项服务(单例)?

转载 作者:太空狗 更新时间:2023-10-29 16:50:17 25 4
gpt4 key购买 nike

我将如何着手将一项服务注入(inject)另一项服务?例如,假设我有一个集合需要另一个集合 (TeamCollection => PlayerCollection)。目前我只是创建两个单独的集合并使用类似的东西:

import {PlayerCollection} from "<<folder>>/player";

但这需要我在 Typescript 中为每个我想成为单例实例的服务编写自己的单例 getInstance 代码。

正确的做法是什么?我希望在我的组件中同时拥有两个单例,并且能够使用构造函数语法将一个服务 @Inject 到另一个服务中,而无需创建单例的新实例。

class TeamCollection {    
constructor(@Inject(PlayerCollection): PlayerCollection) {}
}

最佳答案

因此,在重新阅读 Pascal Precht 的这篇优秀文章后:http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html

看到他评论:http://twofuckingdevelopers.com/2015/04/angular-2-singleton-service/

“使用 Angular 2 的 DI 注入(inject)的所有东西都已经是单例了。不需要这样的服务”

我进行了测试,现在我发现的既回答了我的问题,也让我对 angular2 中的 DI 主题更加困惑。

请看下面的代码:

团队.ts

import {BaseCollection, BaseModel} from "./base";
import {PlayerCollection} from './player';
import {Injectable, Inject} from "angular2/angular2";

@Injectable()
export class TeamCollection extends BaseCollection {
playerCollection: PlayerCollection;
constructor(@Inject(PlayerCollection) playerCollection: PlayerCollection) {
super();
this.playerCollection = playerCollection;
}

create(data: Object): TeamModel {
return new TeamModel(data);
}
}

播放器.ts

import {BaseCollection, BaseModel} from "./base";
import {Injectable} from "angular2/angular2";

@Injectable()
export class PlayerCollection extends BaseCollection {
create(data: Object): PlayerModel {
return new PlayerModel(data);
}
}

团队.spec.ts

/// <reference path="../../typings.d.ts" />

//VERY IMPORTANT TO ALWAYS LOAD THESE
import 'zone.js';
import 'reflect-metadata';
import 'es6-shim';

import {TeamModel, TeamCollection} from "../../app/model/team";
import {PlayerCollection} from "../../app/model/player";
import {Inject, Injector} from "angular2/angular2";

describe('TeamCollection', () => {
var teamCollection: TeamCollection;
var playerCollection: PlayerCollection;
beforeEach(() => {
var injector = Injector.resolveAndCreate([
TeamCollection,
PlayerCollection
]);
teamCollection = injector.get(TeamCollection);

var injectorT = Injector.resolveAndCreate([
PlayerCollection
]);
playerCollection = injector.get(PlayerCollection);
});

it('should have a singleton PlayerCollection shared between all classes within the application', () => {
console.log(teamCollection.playerCollection.uuId);
console.log(playerCollection.uuId);
});
});

只要创建它们的是同一个注入(inject)器(var injector),它们就共享相同的 uuID 虽然当我使用第二个注入(inject)器(var injectorT)时,UUID不同意味着创建了 playerCollection 的新实例。

现在我的问题是。如果我使用组件提供者语法:

@Component({
selector: 'app',
providers: [TeamCollection]
})

@Component({
selector: 'player-list',
providers: [PlayerCollection]
})

两者会共享同一个玩家集合还是都会创建一个新实例?

编辑:只要它们是通过 bootstrap(.., [ServiceA,ServiceB]) 方法创建的,它们就可以。

感谢 pascal precht http://blog.thoughtram.io/angular/2015/09/17/resolve-service-dependencies-in-angular-2.html

关于Angular2 "Services"如何将一项服务@inject 到另一项服务(单例)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33575456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com