如何限定"useValue"多个模块的依赖注入范围?



我想通过useValue提供程序声明一个字符串,供"可重用"模块中的组件使用。 我希望我应该能够在几个顶级模块中用不同的值覆盖相同的"键",并且可重用组件将根据范围层次结构提供最接近模块的值。

示例/为什么

一个示例用例是 CrudModule,它讲述了 API 基础知识(创建、列表等)。 为了使代码保持干燥(没有大量继承),您可以简单地通过依赖注入提供 CRUD 资源名称(例如,"用户"、"团队"、"项目",用于路由v1/usersv1/teamsv1/projects)。在此示例中,您可以将代码库组织到模块中UsersModuleTeamsModuleProjectsModuleCrudModule

这是一个 Plunker,展示了我得到的与我的期望。 这使用了一个更简单(人为)的 Dogs vs Cats 示例,尝试从每个模块提供一个字符串"dog"vs"cat"

https://embed.plnkr.co/pNRpj6/

相反,如果您执行相同的操作,但将提供程序放在组件上,它将按预期工作:

https://embed.plnkr.co/BsgwmR/

问题所在

对于我的应用程序设计,我认为我无法通过将"多态提供程序"放在组件上来获得所需的行为。 最重要的是,我认为将这些放在我的模块上是一个更干净、更好的设计。

我在第一个示例中做错了什么(模块上的提供程序)? 我是否缺少这是预期行为?

添加到要导入到根模块的模块的提供程序将添加到主注入器AppModuleInjector

当同时加载的两个导入模块列出具有相同令牌的提供程序时,第二个模块的提供程序"获胜"。

当 Angular 希望为该令牌注入服务时,它会创建并交付由第二个提供程序创建的实例。

注入此服务的每个类都会获取第二个提供程序创建的实例。即使是在第一个模块中声明的类也会获取第二个提供程序创建的实例。

如果模块 A 为令牌"X"提供服务,并导入也为令牌"X"提供服务的模块 B,则模块 A 的服务定义"胜出"。

根应用模块提供的服务优先于导入模块提供的服务。应用模块始终获胜。

有两个选项可以限制服务范围:

1) 如果您必须急切地加载模块,而不是在组件providers数组中提供animal

普伦克示例

2) 如果可以,请懒惰地加载模块。Angular 为延迟加载的模块提供了自己的子注入器。

最新更新