我一直在试图弄清楚Angular2中的(DI)依赖注入(inject)是如何工作的。每次尝试将服务/或类注入(inject)组件时,都会遇到很多问题/问题。
从不同的Google文章中,我需要在Component配置中使用providers: []
,或者有时需要在构造函数中使用@Inject()
或直接在bootstrap(app, [service])
中注入(inject)?我也看到一些文章希望我放置@injectable
装饰器。
例如:注入(inject)Http,我只需要import{Http}
并将Http放在提供程序中,但是对于FormBuilder,我需要在构造函数中使用@Inject()
。
何时使用什么有什么经验法则吗?您能否提供一些示例代码片段?谢谢 :-)
Angular2中的依赖注入(inject)依赖于链接到组件树的分层注入(inject)器。
这意味着您可以在不同级别上配置提供程序:
用于引导时的整个应用程序。在这种情况下,所有子注入(inject)器(组成部分的注入(inject)器)都将看到此提供程序并共享与之关联的实例。进行交互时,它将是同一实例用于特定组件及其子组件。与以前相同,但用于à特定组件。其他组件将看不到该提供程序。如果重新定义上面定义的内容(例如,在进行引导时),则将使用此提供程序。因此,您可以覆盖所有内容。 用于服务。没有与他们关联的提供者。他们使用触发元素的注入(inject)器中的一个(直接=组件或间接=触发服务链调用的组件)
关于您的其他问题:
@可注入(inject)。要插入一个类,您需要一个装饰器。组件只有一个(@Component是一个),但是服务是简单的类。如果服务要求将依赖项注入(inject)其中,则需要此装饰器。 @注入(inject)。在大多数情况下,构造函数参数的类型足以让Angular2确定要注入(inject)的内容。在某些情况下(例如,如果您显式使用OpaqueToken而不是类来注册提供程序),则需要指定一些有关注入(inject)内容的提示。在这种情况下,您需要使用@Inject。
有关其他详细信息,请参见以下问题:
What's the best way to inject one service into another in angular 2 (Beta)? Angular2: Inject a non @Injectable class Inject all Services that implement some Interface