另一个服务中的Angular2 Inject服务创建了2个实例

时间:2016-04-04 12:06:51

标签: angular

我有两个服务: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已创建'。 我认为服务应该是单身,那有两个实例是什么?

感谢。

3 个答案:

答案 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”属性中。在这种情况下,将为每个组件实例创建服务实例。并且,在引导您的应用程序时您指定的内容将不会被考虑在内...

这是因为分层注射器。更多细节,你可以看看这个问题: