我已经阅读了很多有关Angular依赖注入系统的信息,但似乎仍然找不到一个非常具体的问题的答案。
通过@Module
的{{1}}数组注册的提供程序由模块的当前(最接近的父级)注入器“拾取”。它们通常将在根注入器中注册,除非模块是延迟加载的,这会创建一个单独的注入上下文,该注入上下文的工作方式类似于{}块(外部提供程序可在内部访问,反之亦然,内部提供程序优先) 。如果提供者在providers: []
的{{1}}数组中注册,它们也将被注入单独的上下文中,该上下文仅包括组件本身及其子组件。
在@Component
装饰器中注册的服务发生了什么,对我来说还是个谜。如果该服务从未在任何地方使用该怎么办?还是仅在延迟加载的模块中使用providers: []
怎么办?如果是@Service()
,该怎么办?并且是否应该在模块的@Service({providedIn: root})
数组中提及此类服务?
我能在该主题上找到的唯一具体信息是“ AOT编译器可能会执行诸如摇树之类的某些优化”,说实话,这并没有真正弄清楚。
如果上述某些陈述有误,请随时纠正我。
答案 0 :(得分:3)
首先,没有@Service
装饰器。它名为@Injectable
。
如果仅用@Injectable()
装饰服务,则除非将其添加到模块或组件的providers
数组中,否则不会在任何地方提供该服务。
如果您用@Injectable({ providedIn: 'root' })
装饰它,那么它将在根模块中提供,即等同于将其添加到根模块的提供者数组中。服务,并且不要将其添加到任何捆绑包中(如果它从未注入过任何地方):在这种情况下,由于它不在任何其他TypeScript文件的导入中,因此它可能会摇摇欲坠:没有任何东西使用该服务,因此将其捆绑是没有用的。 >
如果您用@Injectable({ providedIn: SomeModule })
装饰它,那么它将在SomeModule模块中提供,即等同于将其添加到SomeModule模块的providers数组中,与上面相同的例外,即如果没有导入,它将可能摇摇欲坠。