延迟加载和提供者策略
Lazy loading and providers strategy
现在,使用 Angular v5,同时使用延迟加载,我将所有提供程序加载到 app.module.ts
中,我想这可能不是最好的策略,因为这不会加快我的速度应用程序启动时间,特别是因为我有大约 50 个自定义提供程序(不要评判我;))。
因此我问自己是否真的应该为我的所有应用程序加载所有这些,或者我是否应该只在我只使用它们的地方加载它们?
我猜最好只在我真正使用它们的地方加载提供程序。
但在这种情况下,我完全不清楚如何解决以下构造:
假设我有三个页面(A、B 和 C),它们有自己的模块和三个提供商(1、2 和 3)。
A use 1
B use 1, 2, 3
C use 1, 2
我想,因为 1 在所有应用程序中使用,我必须在 app.module.ts
中声明它
因为 3 只在 B 页面使用,我想我只需要在 B.module.ts
中声明它
但是2呢?我如何在 B.module.ts
和 C.module.ts
中声明它以共享相同的提供者 "memory" (如果提供者包含一个值,B 和 C 应该看到相同的对象),我将分别如何编码?只需注入提供程序 "as usual" 和 angular 即可完成剩下的工作?
提前感谢任何帮助,将不胜感激
更新
不确定我是否正确理解了 angular 文档,但这就是目标,应该为所有应用程序加载提供程序,对吗?
见
https://angular.io/guide/ngmodule-faq#q-component-scoped-providers
2018 年更新
注入策略随着 Angular v6 的引入而发展。根据文档,可以使用 providedIn
来指定应该在哪个模块中使用服务。参见 https://angular.io/guide/dependency-injection
您应该创建一个共享模块来增强您的提供者 2 并且 B 和 C 模块包含在它们的依赖项中。
编辑:您不需要导出提供商。
答案是你应该在 app.module.ts
中添加你的提供者,因为它是一个单独的服务。这是来自 angular dependency injection doc:
Dependencies are singletons within the scope of an injector
这意味着当您在 app.module.ts
中声明您的提供者时,它将在整个应用程序中是单例的,并且注入的每个模块都将共享它的相同实例。
当您在单独的模块中声明您的提供者时,即 B.module.ts
和 C.module.ts
,您的 B page
将使用提供者实例,而 C page
将使用 另一个 供应商实例。这不是提供者的目的。
现在,使用 Angular v5,同时使用延迟加载,我将所有提供程序加载到 app.module.ts
中,我想这可能不是最好的策略,因为这不会加快我的速度应用程序启动时间,特别是因为我有大约 50 个自定义提供程序(不要评判我;))。
因此我问自己是否真的应该为我的所有应用程序加载所有这些,或者我是否应该只在我只使用它们的地方加载它们?
我猜最好只在我真正使用它们的地方加载提供程序。
但在这种情况下,我完全不清楚如何解决以下构造:
假设我有三个页面(A、B 和 C),它们有自己的模块和三个提供商(1、2 和 3)。
A use 1
B use 1, 2, 3
C use 1, 2
我想,因为 1 在所有应用程序中使用,我必须在
app.module.ts
中声明它
因为 3 只在 B 页面使用,我想我只需要在
B.module.ts
中声明它
但是2呢?我如何在
B.module.ts
和C.module.ts
中声明它以共享相同的提供者 "memory" (如果提供者包含一个值,B 和 C 应该看到相同的对象),我将分别如何编码?只需注入提供程序 "as usual" 和 angular 即可完成剩下的工作?
提前感谢任何帮助,将不胜感激
更新
不确定我是否正确理解了 angular 文档,但这就是目标,应该为所有应用程序加载提供程序,对吗?
见
https://angular.io/guide/ngmodule-faq#q-component-scoped-providers
2018 年更新
注入策略随着 Angular v6 的引入而发展。根据文档,可以使用 providedIn
来指定应该在哪个模块中使用服务。参见 https://angular.io/guide/dependency-injection
您应该创建一个共享模块来增强您的提供者 2 并且 B 和 C 模块包含在它们的依赖项中。
编辑:您不需要导出提供商。
答案是你应该在 app.module.ts
中添加你的提供者,因为它是一个单独的服务。这是来自 angular dependency injection doc:
Dependencies are singletons within the scope of an injector
这意味着当您在 app.module.ts
中声明您的提供者时,它将在整个应用程序中是单例的,并且注入的每个模块都将共享它的相同实例。
当您在单独的模块中声明您的提供者时,即 B.module.ts
和 C.module.ts
,您的 B page
将使用提供者实例,而 C page
将使用 另一个 供应商实例。这不是提供者的目的。