2016-04-04 3 views
5

У меня есть две службы: AuthService и MonBanquetService, а AuthService зависит от MyService. Вот основной код этих 2-х услуг:Angular2 Inject service в другой службе создает 2 экземпляра

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 created». Я думал, что услуги должны быть одноточиями, а как есть два экземпляра?

Спасибо.

+1

то В идеале вы должны добавить только '' AuthService внутри бутстраповской зависимости, которая создаст экземпляр 'MonBanquetService' путем приобретения его внутри. –

ответ

0

Угловой поддерживает один экземпляр для провайдера. Если вы добавите тип в качестве поставщика в нескольких местах, это приведет к нескольким экземплярам.

Когда ключ (тип, токен) запрашивается у DI, он просматривает иерархию и возвращает экземпляр из первого найденного им поставщика.

Поэтому, если вы хотите глобальный экземпляр, только добавить его в список поставщиков

bootstrap(AppComponent, [MonBanquetService]) 

@NgModule(
    providers: [MonBanquetService], 
    .... 
) 
export class AppMpdule{} 

или как это было предложено угловой командой для пользовательские поставщики в список поставщиков корневого компонента

@Component({ 
    selector: 'my-app', 
    providers: [MonBanquetService] 
}) 
class AppComponent { 
} 

0

Возможно, вы добавили услугу в атрибут «провайдеры» вашего компонента. В этом случае экземпляр службы будет создан для каждого экземпляра компонента. И то, что вы указали при загрузке вашего приложения, не будет учитываться для этой услуги ...

Это было бы из-за иерархических инжекторов. Фор более подробной информации, вы могли бы посмотреть на этот вопрос:

1

На самом деле это не надо. Вы должны убедиться, что вы не используете providers метаданные в декораторе @Component.

Посмотрите здесь

пытался осуществить то, что вы показали, и работает, как ожидалось;

Смежные вопросы