概述
官方认为组件不应该直接获取或保存数据, 它们应该聚焦于展示数据,而把数据访问的职责委托给某个服务。而服务就充当着数据访问,逻辑处理的功能。把组件和服务区分开,以提高模块性和复用性。通过把组件中和视图有关的功能与其他类型的处理分离开,可以让组件类更加精简、高效,这是官方的一些定义。非常认同,以我粗鄙的个人开发经验来看,现实开发中并不能完全的把组件和服务区分开来。并没有做到为组件提供专门的服务,或者说把逻辑处理都放在服务,组件只展示数据。一个模块通常有许多组件,我们的每个业务模块中只存在一个服务,将模块中的数据访问,数据处理判断,通用的方法放在服务中而已。组件中还是会有一些数据的判断,页面的展示逻辑等。当然我们也有服务提供给各个组件使用,一些通用的服务 比如 httpService logService uiServic 等等。可能我说的是针对于业务上等服务无法完全剥离吧。
依赖注入
在 Angular 中,要把一个类定义为服务,就要用 @Injectable() 装饰器来提供元数据,以便让 Angular 可以把它作为依赖注入到组件中。同样,也要使用 @Injectable() 装饰器来表明一个组件或其它类(比如另一个服务、管道或 NgModule)拥有一个依赖。
注入器是主要的机制。Angular 会在启动过程中为你创建全应用级注入器以及所需的其它注入器。你不用自己创建注入器。
该注入器会创建依赖、维护一个容器来管理这些依赖,并尽可能复用它们。
提供商是一个对象,用来告诉注入器应该如何获取或创建依赖。
注:应用中所需的任何依赖,都必须使用该应用的注入器来注册一个提供者,以便注入器可以使用这个提供者来创建新实例。对于服务,该提供者通常就是服务类本身。其中,依赖不一定是服务 —— 它还可能是函数或值。
提供服务