首页 > 解决方案 > Angular 6 依赖注入工厂服务不是单例的

问题描述

我有两个模块 AppModule 和lazyLoadModule。我从 Appmodule 延迟加载lazyLoadModule 的地方。我想与延迟加载的模块共享我的提供程序引用。我创建了如下 SharedProviderModule 并使用 SharedProviderModule.forRoot() 在 AppModule 中导入:

import { NgModule, APP_INITIALIZER, ModuleWithProviders  } from '@angular/core';
import { CounterService } from './counter.service';
@NgModule({
})
export class SharedProviderModule {
    static forRoot(): ModuleWithProviders {
    return {
      ngModule: SharedProviderModule ,
      providers: [ CounterService 
      {
        provide: APP_INITIALIZER,
        useFactory: appConfigFactory,
        deps: [CounterService],
        multi: true
      },
]
    }
  }
}

根据参考博客提供者应该有两个模块的单个实例,但现在对于延迟加载的模块,提供者的新实例正在启动。我使用 SharedProviderModule 中的工厂提供程序覆盖了一些值,这些值未反映在延迟加载的模块中。是我忘记做的事吗?

标签: angulardependency-injectionlazy-loadingfactory-pattern

解决方案


您的延迟加载模块将自动访问在应用程序中注册的所有提供程序。当您的延迟加载模块导入一个模块时,forRoot它实际上会再次注册这些提供程序,从而导致您的问题。

你不应该有一个包含提供者的共享模块,除非你不希望它们成为单例。如果您的AppModule模块和延迟加载的模块都需要提供程序,则在您的模块中注册或导入它,AppModule它将随处可用。


推荐阅读