在多个 NgModule 中提供可重用单例服务的最佳实践(特别是在 monorepo、Nrwl Nx 风格中)
Best practice for providing reusable singleton services in multiple NgModules (and specifically in a monorepo, Nrwl Nx style)
我们有一个单声道存储库,并使用带有 /libs 的 Nx 布局。
很多....service.ts(服务)可以在多个地方重复使用。这是问题...
这些服务主要是从 REST API 中提取的,因此设计为保持单例。应该在哪里提供?
我现在的想法是将每项服务包装在 NgModule
中并在那里提供。然后,任何其他模块想要使用该服务都必须导入 NgModule
。
这样,如果多个模块导入它,NgModule
与服务只会被评估一次,它提供的服务不会被重新实例化。
另一方面,这会使我的源代码树中的文件数量激增。这一切都值得吗?还是有 better/more 优雅的方式来实现它?
我在我们的 monorepo 中所做的是创建一个 angular lib
ng g lib --tags="type:data-access" user/data-access
然后删除创建的默认模块,因为不需要它。
然后创建一个服务
ng g s --project=user-data-access User
这将添加
@Injectable({ providedIn: 'root' })
这将使它成为应用程序中的单例,并在根应用程序模块中提供它。
然后确保在 index.ts
文件中导出服务
我们有一个单声道存储库,并使用带有 /libs 的 Nx 布局。
很多....service.ts(服务)可以在多个地方重复使用。这是问题...
这些服务主要是从 REST API 中提取的,因此设计为保持单例。应该在哪里提供?
我现在的想法是将每项服务包装在 NgModule
中并在那里提供。然后,任何其他模块想要使用该服务都必须导入 NgModule
。
这样,如果多个模块导入它,NgModule
与服务只会被评估一次,它提供的服务不会被重新实例化。
另一方面,这会使我的源代码树中的文件数量激增。这一切都值得吗?还是有 better/more 优雅的方式来实现它?
我在我们的 monorepo 中所做的是创建一个 angular lib
ng g lib --tags="type:data-access" user/data-access
然后删除创建的默认模块,因为不需要它。
然后创建一个服务
ng g s --project=user-data-access User
这将添加
@Injectable({ providedIn: 'root' })
这将使它成为应用程序中的单例,并在根应用程序模块中提供它。
然后确保在 index.ts
文件中导出服务