Actualización (Angular 6 +)
La forma recomendada de crear un servicio singleton ha cambiado. Ahora se recomienda especificar en el @Injectable
decorador del servicio que se debe proporcionar en la 'raíz'. Esto tiene mucho sentido para mí y ya no es necesario enumerar todos los servicios proporcionados en sus módulos. Solo importa los servicios cuando los necesita y se registran en el lugar adecuado. También puede especificar un módulo para que solo se proporcione si se importa el módulo.
@Injectable({
providedIn: 'root',
})
export class ApiService {
}
Actualización (Angular 2)
Con NgModule, creo que la forma de hacerlo ahora es crear un 'CoreModule' con su clase de servicio y enumerar el servicio en los proveedores del módulo. Luego importa el módulo central en el módulo de la aplicación principal que proporcionará la única instancia a los niños que soliciten esa clase en sus constructores:
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 { }
Respuesta original
Si incluye un proveedor bootstrap()
, no necesita incluirlo en su 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 hecho, la inclusión de su clase en 'proveedores' crea una nueva instancia de la misma, si algún componente principal ya lo incluye, los hijos no necesitan hacerlo y, si lo hacen, obtendrán una nueva instancia.
UserService
yFacebookService
enproviders
ningún otro lugar?