Atualização (Angular 6 +)
A maneira recomendada de criar um serviço singleton mudou. Agora é recomendado especificar no @Injectable
decorador no serviço que ele deve ser fornecido na 'raiz'. Isso faz muito sentido para mim e não há mais a necessidade de listar todos os serviços fornecidos em seus módulos. Você apenas importa os serviços quando precisa deles e eles se registram no local apropriado. Você também pode especificar um módulo para que ele seja fornecido apenas se o módulo for importado.
@Injectable({
providedIn: 'root',
})
export class ApiService {
}
Atualização (Angular 2)
Com o NgModule, acho que a maneira de fazer isso agora é criar um 'CoreModule' com sua classe de serviço e listar o serviço nos provedores do módulo. Em seguida, importe o módulo principal no módulo principal do aplicativo, que fornecerá a instância para todos os filhos que solicitarem essa classe em seus construtores:
CoreModule.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ApiService } from './api.service';
@NgModule({
imports: [
CommonModule
],
exports: [ // components that we want to make available
],
declarations: [ // components for use in THIS module
],
providers: [ // singleton services
ApiService,
]
})
export class CoreModule { }
AppModule.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AppComponent } from './app.component';
import { CoreModule } from './core/core.module';
@NgModule({
declarations: [ AppComponent ],
imports: [
CommonModule,
CoreModule // will provide ApiService
],
providers: [],
bootstrap: [ AppComponent ]
})
export class AppModule { }
Resposta original
Se você listar um provedor bootstrap()
, não precisará listá-lo no decorador de componentes:
import { ApiService } from '../core/api-service';
@Component({
selector: 'main-app',
templateUrl: '/views/main-app.html',
// DO NOT LIST PROVIDERS HERE IF THEY ARE IN bootstrap()!
// (unless you want a new instance)
//providers: [ApiService]
})
export class MainAppComponent {
constructor(private api: ApiService) {}
}
De fato, listar sua classe em 'fornecedores' cria uma nova instância dela, se algum componente pai já a lista, os filhos não precisam, e se o fizerem, obterão uma nova instância.
UserService
eFacebookService
aproviders
nenhum outro lugar?