Angular 角度:我把多个模块使用的服务放在哪里

Angular 角度:我把多个模块使用的服务放在哪里,angular,typescript,lazy-loading,ng-modules,Angular,Typescript,Lazy Loading,Ng Modules,我刚开始使用angular框架的feature module+延迟加载路由部分,在适应细微差别方面有点困难。现在经常出现的一件事是如何存储服务和接口——它们是否应该只放在使用它们的模块的提供者数组中?还是应该将某种主服务模块注入根模块 我从各种教程中了解到,服务和接口不应包含在核心模块或共享模块中 我之前在做什么: //service.module.ts @NGD模块{ 进口:[], 出口:[], 声明:[], 提供者:[], } 导出类服务模块{ 静态forRoot:ModuleWithPro

我刚开始使用angular框架的feature module+延迟加载路由部分,在适应细微差别方面有点困难。现在经常出现的一件事是如何存储服务和接口——它们是否应该只放在使用它们的模块的提供者数组中?还是应该将某种主服务模块注入根模块

我从各种教程中了解到,服务和接口不应包含在核心模块或共享模块中

我之前在做什么:

//service.module.ts @NGD模块{ 进口:[], 出口:[], 声明:[], 提供者:[], } 导出类服务模块{ 静态forRoot:ModuleWithProviders{ 返回{ ngModule:ServicesModule, 供应商:[ 所有服务 在我们的申请中提供 ] } } } //然后在app.module.ts中 进口:[ ServicesModule.forRoot, ] 所以我的选择是

保持设置不变,在app文件夹中有一个名为“services”的集合目录,并在需要服务的组件中使用构造函数DI。同样,对于模型/接口,从名为“models”的目录导入它们。 将服务移动到需要它们的模块中,并且只在ServicesModule中提供共享服务,这有助于延迟加载模块。 我想一个不同/更简单的问题是,如果我将所有服务移回
我的app.module,这会简化事情吗?似乎与直觉相反。

如果您将这些都放在服务模块中,并将其导入AppModule中,则其行为与可注入的{providedIn:'root'}相同。如果一个服务确实需要全局可访问,那么将其标记为providedIn:“root”并没有错,而且Angular仍将以某种方式延迟加载,如果没有任何注入,则不会创建该根提供的服务的实例。最重要的是,除非您在另一个模块/组件的providers数组中重新提供服务,否则将只创建一个服务实例并在注入它的所有组件之间共享

在某些方面,这种行为是可取的。例如,如果您有一个用户服务,该服务提供有关当前登录用户的数据,则该服务很可能在任何地方都使用,只需要创建一个实例。因此,在这种情况下,在“root”中提供或在AppModule中提供它是有意义的

相反,如果您有一个为表组件提供表数据的服务,那么您可能希望在组件级别提供该服务,以便表的每个实例都可以访问自己的数据。如果在根目录下提供此服务,则每个表都将共享相同的数据

通常我所做的要么只是在需要的组件/模块中提供服务,要么在“根”中提供服务,如果需要在整个应用程序中单独提供服务

您还可以在模块提供一个服务的地方创建小的原子模块,然后在需要的地方导入该小模块,以允许延迟加载

例如:

@NgModule({
    providers: [TestService]
})
export class TestModule { }
然后,任何具有需要注入该服务的组件/指令/服务/etc的模块,您都可以将TestModule添加到包含该组件/指令/服务/etc的模块的imports数组中

constructor(private testService: TestService) { }

我的另一个想法是为我的web api定义一个通用服务 组件正在与进行交互。就像在react中一样,使用钩子和useContext:

useFirestore.js
useStorage.js
useAnalytics.js
我不确定这是不是一个好方法,因为我见过的大多数src代码都有特定于他们访问的数据库集合或文档的服务。我正在考虑这是否是一个好主意。缺点是,这将是一个巨大的服务,在我的应用程序中随处可见,这肯定是不吸引人的

export class FirestoreService {

  collection : AngularFirestoreCollection<any>;

  constructor(
    collectionName : string,
    collectionMetadata : { },
    private afs : AngularFirestore
   ) {
      this.collection = this.afs.collection(collection_name)

 }

  create( new_object : { }) { }
  update( new_object: {} ) { }
  delete( ) { } 
  filter,
  search,
  etc...
  
}
export class FirestoreService {

  collection : AngularFirestoreCollection<any>;

  constructor(
    collectionName : string,
    collectionMetadata : { },
    private afs : AngularFirestore
   ) {
      this.collection = this.afs.collection(collection_name)

 }

  create( new_object : { }) { }
  update( new_object: {} ) { }
  delete( ) { } 
  filter,
  search,
  etc...
  
}