我认为你正在寻找https://angular.io/docs/ts/latest/cookbook/ngmodule-faq.html#!#q-module-provider-visibility
为什么一个功能模块,随处可见中提供的服务? 引导程序模块 的@ NgModule.providers中列出的提供程序具有应用程序范围。添加一个服务提供商 @ NgModule.providers有效地发布服务于整个 应用。
当我们导入模块时,Angular将模块的服务提供商 (其提供程序列表的内容)添加到应用程序根注入器。
这使得供应商在 知道供应商的查询令牌的应用程序的每个类可见。
这是由设计。通过模块导入实现的扩展性是Angular模块系统的主要目标 。合并模块供应商到 应用注射器,很容易让一个模块库,充实新的服务 整个应用程序。通过添加一次HttpModule,每个应用程序组件都可以发出http请求。
但是,如果您期待 模块的服务仅对 声明的特征模块可见的组件可见,这会感觉不受欢迎的惊喜。如果HeroModule提供HeroService和 根的AppModule进口HeroModule,虽然知道 HeroService类型可以注入在HeroModule宣称的服务,而不仅仅是类 任何类。
模块的提供者添加到根的范围。丢弃重复项。这意味着提供程序可以从整个应用程序中找到,除非它们在组件或延迟加载的模块上被重写。延迟加载的模块获取它们自己的根作用域。
如果红色模块被延迟加载,那么组件3将从该模块获取提供程序,如果它急于加载,则将红色模块的提供程序添加到应用程序的根作用域,组件3将从那里获取它。这是所有与由添加到@Component()
或@Directive()
@NgModule()
提供商添加并不提升到任何根范围提供商。 DI从对其父代及其父代有依赖关系的组件中查找,对于提供者以及最后在应用程序的根作用域中或在延迟加载模块的根作用域中查找(如果组件是一个组件的一部分) 。
你可以使用augury来检查你的依赖关系图。 – Manish
@ user32,谢谢,我会看看 –