什么时候提供 Angular 2+ 服务

When does the Angular 2+ service get provided

我已经阅读了很多关于 Angular 依赖注入系统的内容,但似乎仍然无法找到一个非常具体的问题的答案。

通过 @Moduleproviders: [] 数组注册的供应商是 'picked up' 模块的当前(最近的父级)注入器。它们通常会在根 Injector 中注册,除非模块是延迟加载的,它会创建一个单独的注入上下文,它的工作方式有点像 {} 块(外部提供者可以在内部访问,但反之亦然,内部提供者优先) .如果提供者在 @Componentproviders: [] 数组中注册,它们也会被注入单独的上下文中,该上下文仅包括组件本身及其子组件。

然而,在 @Service() 装饰器中注册的服务发生了什么对我来说是个谜。如果该服务从未在任何地方使用过怎么办?或者,如果 @Service({providedIn: root}) 仅在延迟加载模块中使用怎么办?如果是 providedIn: SomeLazyLoadedModule 怎么办?是否应该在模块的 providers 数组中提及此类服务?

我能找到的关于该主题的唯一具体信息是 'The AOT compiler may perform some optimizitions such as tree shaking',老实说,它并没有真正阐明很多。

如果上面的某些陈述有误,请随时纠正我。

首先,没有@Service装饰器。它被命名为 @Injectable.

如果您仅使用 @Injectable() 装饰服务,那么它不会在任何地方提供,除非您将它添加到模块或组件的 providers 数组中。

如果你用@Injectable({ providedIn: 'root' })装饰它,那么它是在根模块中提供的,即相当于将它添加到根模块的providers数组中除了这允许完全忽略该服务,并且如果它从未被注入到任何地方,则不将其添加到任何包中:在这种情况下,由于它不在任何其他 TypeScript 文件的导入中,它可以被摇树:没有使用该服务,所以捆绑它没用。

如果你用@Injectable({ providedIn: SomeModule })装饰它,那么它是在模块SomeModule中提供的,即它相当于将它添加到模块SomeModule的providers数组中与上面相同的例外情况,即如果没有导入它, 可以摇树。