如何判断Angular2模块是否可以导入共享模块

如何判断Angular2模块是否可以导入共享模块,angular,Angular,是否有一个石蕊测试来确定一个模块是提供者还是导出其他作为提供者的模块;用于确定模块是否为“共享”模块中列出的候选模块 从angular.io: 由于前面解释的原因,SharedModule不应具有提供程序。其任何导入或重新导出的模块也不应具有提供程序。如果您违反此准则,请了解您正在做什么以及为什么要这样做 但是,如果我要使用一个模块,比如ReactiveFormsModule或RoutingModule,我如何确定它是否通过了上述测试?如果我只使用SharedModule中没有提供程序的模块,

是否有一个石蕊测试来确定一个模块是提供者还是导出其他作为提供者的模块;用于确定模块是否为“共享”模块中列出的候选模块

从angular.io:

由于前面解释的原因,SharedModule不应具有提供程序。其任何导入或重新导出的模块也不应具有提供程序。如果您违反此准则,请了解您正在做什么以及为什么要这样做


但是,如果我要使用一个模块,比如ReactiveFormsModule或RoutingModule,我如何确定它是否通过了上述测试?如果我只使用SharedModule中没有提供程序的模块,或者使用重新导出提供程序的导入模块,那么肯定有某种方法可以判断模块是否满足此要求。这是什么?

常见的做事方式如下图所示


通常,提供程序总是列在相应模块的
提供程序[]
中,如果其作用域仅限于该特定模块,则将其移动到根模块AppModule。

服务通常是具有应用程序范围的单例服务

导入模块时,导入模块提供的服务将添加到主机模块的注入器中。通过在共享模块中提供服务,存在多个模块导入共享模块并创建多个服务副本的实际危险,每个副本都具有模块范围。如果向SharedModule添加服务,请确保这是您想要的

根据最佳实践,每个应用程序都应该有一组核心模块。这些核心模块不是共享的(它应该只由AppModule导入),因此在不破坏单例意图的情况下向核心模块添加服务是安全的

石蕊试验:

如果您想要在应用程序范围内共享单例服务,那么 不要将它们放在共享模块中,因为共享模块可能是 从同一应用程序中的多个模块导入。相反 将它们放入核心模块中,该模块只能由 应用模块

请记住以下公约和准则:

  • 每个应用程序只有一个AppModule
  • AppModules可以导入其他模块
  • 核心模块只能由AppModule导入
  • 共享模块可以由任何模块导入(不仅仅是AppModule)

  • @Aravind Opinion based=“角度比反应好吗?”。这个问题是“考虑到这一点,构建我的应用程序的好方法是什么?”,虽然它有一些观点,但它的立足点是逻辑。Stackoverflow越来越不友好了/咆哮(这不是攻击你的评论,只是这个问题被锁定的可能性让我恼火)好的。我将问题切分为它的本质…我认为你的问题是关于共享模块中的提供者,而不是组件。可以帮你修改标题吗?谢谢。可能是。我有点挣扎。这个页面:给我的印象是,我可以或应该将FormsModule之类的模块放入共享中,以减少代码重复。然后在需要FormsModule的地方导入sharedModule。因此,这就引出了一个问题:哪些模块可以或应该共享,以及如何确定它们是否适合共享。我了解有关共享服务的信息。谢谢。FormsModule的文档中列出了一个提供程序“RadioControlRegistry”。ReactiveFormsModule中列出了两个提供程序。“FormBuilder,RadioControlRegistry。”那么为什么可以将它们放在共享模块中呢?我再次寻找石蕊测试,如果有的话。在构建应用程序的过程中,我不希望每次需要使用新模块时都会出现堆栈溢出。在我看来,应该有一些科学的方法来确定,在给出的最常见的例子FormsModule上,它显然违反了给出的规则。@Boice在这一个xp上晚了几年。但是我