Angular “如何确定范围”;“使用价值”;来自多个模块的依赖注入?

Angular “如何确定范围”;“使用价值”;来自多个模块的依赖注入?,angular,typescript,dependency-injection,Angular,Typescript,Dependency Injection,我想通过useValue提供程序声明一个字符串,供“可重用”模块中的组件使用。我希望我能够在几个顶级模块中用不同的值覆盖相同的“键”,并且可重用组件将根据范围层次结构提供最接近的模块值 示例/原因 这方面的一个示例用例是CrudModule,它讲API基础知识(创建、列表等)。 为了保持代码干燥(没有大量继承),您可以简单地通过依赖项注入提供CRUD资源名称(例如,“用户”、“团队”、“项目”,用于路由v1/users,v1/teams,v1/projects)。在本例中,您可以将代码库组织到模

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

示例/原因 这方面的一个示例用例是CrudModule,它讲API基础知识(创建、列表等)。 为了保持代码干燥(没有大量继承),您可以简单地通过依赖项注入提供CRUD资源名称(例如,“用户”、“团队”、“项目”,用于路由
v1/users
v1/teams
v1/projects
)。在本例中,您可以将代码库组织到模块
UsersModule
TeamsModule
ProjectsModule
CrudModule

这是一个Plunker,展示了我得到的与我的期望。这使用了一个更简单(人为)的狗与猫的例子,试图从每个模块中提供字符串
“dog”
“cat”

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

问题 对于我的应用程序设计,我不认为我可以通过在组件上放置“多态提供者”来获得所需的行为。最重要的是,我认为将它们放在我的模块上是一种更干净、更好的设计

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

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

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

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

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

如果模块A为令牌“X”提供服务并导入也为令牌“X”提供服务的模块B,则模块A的服务定义“wins”

根AppModule提供的服务优先于导入模块提供的服务。AppModule总是赢

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

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


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

感谢您对这一点的详细说明。延迟加载如此剧烈地改变了DI的行为,这似乎很奇怪