在AppModule中导入的共享模块

时间:2018-11-07 09:16:32

标签: angular

我正在阅读有关模块的Angular文档,寻找不鼓励在AppModule内部导入SharedModule的行。

我什么都没找到,只是一个GitHub问题,指出最好不要导入它。但是没有任何深入的解释...

https://github.com/tomastrajan/angular-ngrx-material-starter/issues/47

我不赞成在共享模块中提供服务。但是没有别的。

所以我的问题是:

由于我所有的功能模块都是延迟加载的,并且需要导入共享模块,而且我的应用程序组件也需要使用同一共享模块提供的内容,因此将其导入AppModule是一种不好的做法吗? / p>

后果可能是什么?

预先感谢任何人

3 个答案:

答案 0 :(得分:5)

SharedModule导入到AppModule中的问题在于,提供程序将在功能模块中注入两次(一次由SharedModule注入,一次由AppModule注入) ),这将导致服务不像预期的那样单身。

要实现的常见模式不是像这样直接在@NgModule声明中公开提供程序,而是在静态forRoot函数中(该名称不是强制性的,这是一个约定):

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

SharedModule导入AppModule时,请使用SharedModule.forRoot(),将其导入功能模块时,只需将其导入为SharedModule

答案 1 :(得分:2)

只需查看此链接shared module,在AppModule中导入共享模块就不是一个坏习惯

共享模块是关于拥有通用模块的,例如,如果您有form module some module,这是所有模块都需要的,而不是导入所有模块,则可以在shared module中将其导入并导出一样-检查链接以进一步澄清

对于服务,它可以仅注入AppModule中的一个模块中-服务为injectable,并且如果已将其注入根模块中,则可以在任何模块中使用

@Injectable({
    providedIn: 'root'
})

在您的服务顶部使用此装饰器,它将自动将您的服务插入根模块

谢谢-编码愉快!!

答案 2 :(得分:0)

只要您避免在共享模块中声明服务,我就不会发现任何问题。