在懒加载模块中提供服务
Provide service in lazy loaded module
一个项目正在 app/root 模块中静态导入模块 A 单例(使用 forRoot),其中包含使用提供的服务注入令牌的服务。
const providedChildServices: ChildService[] = this._injector.get(ProvidedByChildService, []); //inside the root service
此 ProvidedByChildService 由模块 B 提供,该模块在应用程序内部导航时延迟加载。
发生此行为:用户在应用程序内部导航,进入 B 模块的内部路由 --> 模块 B 的所有内容都是延迟加载的 --> 提供了 RootService 请求 'ProvidedByChildService' 但找不到它。这种架构可能吗?当我在 A 模块(而不是 B)中将 ProvidedByChildService 注册为提供者时,它起作用了。
不,这是不可能的。根服务依赖子服务不是正确的架构选择。
如果根服务依赖于后续服务,则该服务也需要在根中。
您没有说明需要这样做的原因。但是在您提供的场景中,您不保存根包的字节,因为根服务中已经引用了子服务,因此将与其捆绑在一起。
至于为什么你的代码不起作用 - 根服务中的 _injector
是根注入器,因此它不会尝试通过查看子模块来解析模块。在 angular 中,加载的模块创建一个提供者树,子注入器在其中遍历树直到找到他们寻找的提供者 - 而不是相反。
我提供一些可能的解决方案:
- 您将当前的子服务移动到根目录中。
- 您将依赖于子服务的根服务部分移动到将在子模块中提供的新子服务中。
- 您将子服务标记为根模块的
@Optional
依赖项,并将根服务的提供者添加到子模块 providers
数组中。
一个项目正在 app/root 模块中静态导入模块 A 单例(使用 forRoot),其中包含使用提供的服务注入令牌的服务。
const providedChildServices: ChildService[] = this._injector.get(ProvidedByChildService, []); //inside the root service
此 ProvidedByChildService 由模块 B 提供,该模块在应用程序内部导航时延迟加载。
发生此行为:用户在应用程序内部导航,进入 B 模块的内部路由 --> 模块 B 的所有内容都是延迟加载的 --> 提供了 RootService 请求 'ProvidedByChildService' 但找不到它。这种架构可能吗?当我在 A 模块(而不是 B)中将 ProvidedByChildService 注册为提供者时,它起作用了。
不,这是不可能的。根服务依赖子服务不是正确的架构选择。
如果根服务依赖于后续服务,则该服务也需要在根中。
您没有说明需要这样做的原因。但是在您提供的场景中,您不保存根包的字节,因为根服务中已经引用了子服务,因此将与其捆绑在一起。
至于为什么你的代码不起作用 - 根服务中的 _injector
是根注入器,因此它不会尝试通过查看子模块来解析模块。在 angular 中,加载的模块创建一个提供者树,子注入器在其中遍历树直到找到他们寻找的提供者 - 而不是相反。
我提供一些可能的解决方案:
- 您将当前的子服务移动到根目录中。
- 您将依赖于子服务的根服务部分移动到将在子模块中提供的新子服务中。
- 您将子服务标记为根模块的
@Optional
依赖项,并将根服务的提供者添加到子模块providers
数组中。