Page 128 - AngularJS权威教程
P. 128

108  第 13 章  依赖注入






                      第13章

                                       依赖注入








                 一个对象通常有三种方式可以获得对其依赖的控制权:
                 (1) 在内部创建依赖;
                 (2) 通过全局变量进行引用;
                 (3) 在需要的地方通过参数进行传递。

                 依赖注入是通过第三种方式实现的。其余两种方式会带来各种问题,例如污染全局作用域,
             使隔离变得异常困难等。依赖注入是一种设计模式,它可以去除对依赖关系的硬编码,从而可以
             在运行时改变甚至移除依赖关系。
                 在运行时修改依赖关系的能力对测试来讲是非常理想的,因为它允许我们创建一个隔离的环
             境,从而在测试环境可以使用模拟的对象取代生产环境中的真实对象。
                 从功能上看,依赖注入会事先自动查找依赖关系,并将注入目标告知被依赖的资源,这样就
             可以在目标需要时立即将资源注入进去。

                 在编写依赖于其他对象或库的组件时,我们需要描述组件之间的依赖关系。在运行期,注入
             器会创建依赖的实例,并负责将它传递给依赖的消费者。

                 // 出自Angular文档的优秀示例
                 function SomeClass(greeter) {
                     this.greeter = greeter;
                 }
                 SomeClass.prototype.greetName = function(name) {
                     this.greeter.greet(name);
                 };

                         注意,示例代码在全局作用域上创建了一个控制器,这并不是一个好主意,这
                        里只是为了方便演示。
                 SomeClass能够在运行时访问到内部的greeter,但它并不关心如何获得对greeter的引用。
             为了获得对greeter实例的引用,SomeClass的创建者会负责构造其依赖关系并传递进去。

                 基于以上原因,AngularJS使用$injetor(注入器服务)来管理依赖关系的查询和实例化。
             事实上,$injetor负责实例化AngularJS中所有的组件,包括应用的模块、指令和控制器等。
                 在运行时,任何模块启动时$injetor都会负责实例化,并将其需要的所有依赖传递进去。

                 例如下面这段代码。这是一个简单的应用,声明了一个模块和一个控制器:
   123   124   125   126   127   128   129   130   131   132   133