Разница заключается в определении объема службы.
. При этом один и тот же экземпляр службы внедряется во все компоненты. Это называется синглтоном:
@Injectable({
providedIn: 'root'
})
export class MyService {
}
Это приведет к тому, что один и тот же экземпляр службы будет добавлен во все компоненты в этом модуле :
@NgModule({
providers: [ MyService ]
})
export class MyModule {}
Если вы только есть один модуль - AppModule
- нет разницы между двумя подходами - они эквивалентны. В этом сценарии рекомендуется объявить все службы как * 1012. *
Если у вас есть несколько модулей, вы можете объявить одноэлементную службу, а также указать указанную версию модуля c в одном из ваши модули, переопределив его в модуле providers: []
.
Возьмите этот пример:
@Injectable({ providedIn: 'root' })
export class MyService {
}
@NgModule({
declarations: [
ComponentA,
ComponentB
]
})
export class AppModule { }
@NgModule({
declarations: [
FeatureComponentA,
FeatureComponentB
],
providers: [
MyService
]
})
export class MyFeatureModule { }
@NgModule({
declarations: [
OtherComponentA,
OtherComponentB
]
})
export class MyOtherModule { }
ComponentA
, ComponentB
, OtherComponentA
, OtherComponentB
все получат тот же экземпляр MyService
при его внедрении.
FeatureComponentA
и FeatureComponentB
получат второй экземпляр MyService
, поскольку в модуле объявлен поставщик, в котором объявлены компоненты.