在 angular,使用 providedIn 和 forRoot 时的循环依赖

in angular, Circular dependency when using providedIn and forRoot

我正在开发一个 angular 库。它有一个内部服务。定义如下。 使用 providedIn 可进行摇树优化。并且没有使用 providedIn:'root' 因为它是内部的并且只在模块范围内使用。

@Injectable({
  providedIn: MyChartModule,
})
export class LineChartLibService {

当我想在模块定义中添加 forRoot 以在延迟加载中只有一个实例时,它遇到了循环依赖。

export class MyChartModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: MyChartModule,
      providers: [LineChartLibService],
    };
  }
}

遇到这种情况我们应该怎么办? 是否可以在库中提供可延迟加载的 tree-shakable 服务?

WARNING: Circular dependency: dist\my-chart\esm2015\lib\my-chart.module.js -> dist\my-chart\esm2015\lib\line-chart\line-chart.component.js 
-> dist\my-chart\esm2015\lib\line-chart-lib.service.js -> dist\my-chart\esm2015\lib\my-chart.module.js

我认为会发生以下情况:

  1. 您有可能需要 LineChartLibService 的行-chart.component.js。
  2. 在 LineChartLibService 中,您说这个 Injectable 是在 MyChartModule 中提供的。
  3. 在 MyChartModule 中,您可能将行-chart.component.js 声明为该模块的一部分。

这意味着模块请求组件,组件请求服务,服务请求模块,然后再次请求组件:循环依赖。

如果您在问题中添加更多代码和上下文,我们可能会提出更好的建议;-)

我之前已经回答了一个(非重复的)问题,为您提供了这种方法的替代方法。

采用此设置:

我的-module.ts

declarations: [
  MyComponent
]

我的-service.ts

@Injectable({ providedIn: MyModule })

我的-component.ts

constructor(private myService: MyService) {}
  • 我的服务导入我的模块
  • 我的模块导入我的组件
  • 我的组件导入我的服务

存在循环依赖。

解决方法

解决方法是创建一个服务模块并将其导入到您的模块中。

我的-module.ts

imports: [
  MyModuleServices
],
declarations: [
  MyComponent
]

我的模块-services.ts

// no imports or declarations

我的-service.ts

@Injectable({ providedIn: MyModuleServices })

我的-component.ts

constructor(private myService: MyService) {}

备选

更直接的方法是将服务添加到模块的提供程序。

@NgModule({
  providers: [ MyService ]
})
export class MyModule {}