这在文档中非常混乱,因为一部分建议在模块提供者数组中加载服务将使其可用于整个应用程序,如果我们需要隔离此服务,唯一的方法是将其包含在顶级父组件的提供者中不是功能模块提供商。
在应用程序启动时加载模块时,其@NgModule.providers具有应用程序范围。它们可在整个应用中注射。
如果可以的话,懒洋洋地加载模块。 Angular为延迟加载的模块提供了自己的子注入器。模块的提供程序仅在使用此注入器创建的组件树中可见。
如果必须急切加载模块,则在应用程序启动时,请在组件中提供服务。
https://angular.io/docs/ts/latest/cookbook/ngmodule-faq.html#!#q-component-scoped-providers
另一方面,文档中还有另一部分说不然,为了隔离服务,我们可以将它添加到模块的providers数组中,并将它隔离到这个特定的功能模块。
在危机中心域之外既不需要也不想要CrisisService。我们在CrisisCenterModule提供程序数组中注册了CrisisService,而不是在AppModule的提供程序中注册它 - 这使得它在任何地方都可见。
这将危机服务的范围限制在危机中心路线上。危机中心以外的任何模块都无法访问它。
https://angular.io/docs/ts/latest/guide/router.html#!#child-routing-component
哪个概念是正确的?
这两个概念都是对的。在NgModule中定义服务会导致您可以将该服务用作单例。
但是,如果将服务定义为独立组件,angular将创建该服务的新实例。