Angular快速入门 —— 服务与依赖注入
从代码中可以看到,服务就是一个普通的类,类里面定义了一些实例函数。服务提供了一些特定的功能,通常使用在组件内部,作为组件功能的一个扩展。服务怎么样才能被组件使用呢?这时候需要引入依赖注入机制。
依赖注入依赖注入机制是组件引入外部构建(如服务)的一种机制。最常用的就是引用服务,组件引入服务,实际上是引用的服务类的实例,所以服务被引入之前,会有一个实例化的过程。通常这个实例要被缓存起来,以备其它组件使用。所以管理实例化以及实例缓存的过程正是依赖注入所实现的。服务的实例存储在依赖注入机制建立的依赖注入器对象里。当组件需要依赖某个服务的时候,依赖注入机制会从注入器对象里查找匹配的实例。找到后便执行注入操作。
依赖注入示例Providers属性是依赖注入的关键步骤。依赖注入机制会根据Providers提供的服务类型,这里是LoggerService,预先实例化这个对象,并缓存到注入器里。然后我们发现组件构造函数里面也有一个LoggerService类型的参数。这种指定类型的语法是Typescript提供的。依赖注入机制会根据构造函数里面的参数需求从注入器对象里查找这个LoggerService实例,找到后传入到组件的构造函数里。最终组件便获得LoggerService的实例引用,这就是Angular2的依赖注入基本流程。
分层注入举个例子,这里有一个简单的组件树。当我们在根组件注入LoggerService日志服务的时候,那么整个组件树都能够使用到根组件的这个日志服务实例,而且是保证单例的形态。所以我们在根组件设置日志服务级别为warn的时候,整个组件树使用的日志服务级别都是warn级别的。这样的情况只需LoggerService实例化并且配置一次就可以使用在这个应用里。但是开发一段时间后,程序越来越复杂。假如我们需要在子组件B能够打印出更多的日志,也就是它的日志级别更低。如果这时候在修改LoggerService的日志级别能达到效果吗?很显然不行的。记住这个LoggerService是单例,无论在哪里修改配置,影响的都是同一个实例。这时候需要拿出分层注入的秘密武器。分层注入需要我们在适当的位置里重新创建一个新的实例。只需要在对应的组件重新注入即可。所以我们子组件B重新注入LoggerService,并且设置该实例日志服务级别为debug.重新注入之后,子组件B以及它所有子组件都会使用这个全新的debug级别日志服务实例。这就是分层注入的概念,分层注入的概念源于组件树里面的不能层级。分层注人不会影响到组件树里面其它分支。所以根组件以及子组件A仍然使用原来的warn级别日志服务。