我有两个服务:AuthService和MonBanquetService,AuthService依赖于MyService。以下是这两项服务的基本代码:
AuthService.ts:
import {Inject, Injectable} from 'angular2/core';
import {MonBanquetService} from '../monbanquet.service'
@Injectable()
export class AuthService {
public username: string;
constructor(protected _monBanquetService: MonBanquetService) {
// do something()
}
}
MonBanquetService.ts
import {Injectable, Component} from 'angular2/core';
import {Http, Headers, Response} from 'angular2/http';
import {Router} from 'angular2/router';
@Injectable()
export class MonBanquetService {
constructor(public http: Http, private _router: Router) {
console.log('MonBanquetServices created');
}
}
我把这两个服务作为提供者放在boot.ts中:
bootstrap(AppComponent, [
ROUTER_PROVIDERS,
provide(LocationStrategy, {useClass: HashLocationStrategy}),
HTTP_PROVIDERS,
MonBanquetService,
AuthService
]);
然而,当我运行应用程序时,我看到两个控制台日志' MonBanquetServices已创建'。 我认为服务应该是单身,那有两个实例是什么?
感谢。
答案 0 :(得分:1)
实际上它不应该。您必须确保不将providers
元数据用于@Component
装饰器。
看这里
尝试实现您展示的内容并按预期工作;
答案 1 :(得分:1)
Angular为每个提供者维护一个实例。如果在多个位置添加类型作为提供者,则会产生多个实例。
当从DI请求密钥(类型,令牌)时,它会查找层次结构并从找到的第一个提供程序返回实例。
因此,如果您想要一个全局实例,只需将其添加到
的提供者列表中<击> 撞击>
<击>bootstrap(AppComponent, [MonBanquetService])
击> <击> 撞击>
@NgModule(
providers: [MonBanquetService],
....
)
export class AppMpdule{}
<击> 或者由Angular团队建议自定义提供者到根组件的提供者列表
@Component({
selector: 'my-app',
providers: [MonBanquetService]
})
class AppComponent {
}
击> <击> 撞击>
答案 2 :(得分:0)
也许您已将服务添加到组件的“providers”属性中。在这种情况下,将为每个组件实例创建服务实例。并且,在引导您的应用程序时您指定的内容将不会被考虑在内...
这是因为分层注射器。更多细节,你可以看看这个问题: