Angular6学习笔记19:核心知识-服务与依赖注入

服务

服务是一个广义的概念,它包括应用所需的任何值、函数或特性。狭义的服务是一个明确定义了用途的类。它应该做一些具体的事,并做好。

Angular中的服务从广义的角度来说:它包括:应用所需要的任何值、函数或者其他特性,从狭义的角度来说:它是一个有明确定义用途的类,它可以做一些具体的事情。Angular会把组件和服务分开,从而提高模块性和复用性。通过把组件中的视图有关的功能与其他类型的处理分离开,从而使组件的类(class)更加精简、高效。在理想的情况下,组件只负责用户体验,而不用顾及其他,组件应该提供用于数据绑定的属性和方法,从而起到一个作为视图(由模版渲染)和应用逻辑(包含一些魔性的概念)的中间者。

组件应该把:从远端服务器获取数据,验证用户的输入数据,控制台中写日志等逻辑委托给各种服务去做。通过把各种处理任务定义到可注入的服务类中,这个服务可以被任何组件使用(在组件的构造方法中声明,然后就可以使用了)。通过在不同的环境中注入统一种服务的不同提供商,从而提高应用的适应性。这只是Angular的一些原则,不会强制要求遵循,它只会通过依赖注入使应用更好的将逻辑分解为服务,并让这些服务可以用于各个组件中。

依赖注入(dependency injection)

依赖注入被融入 Angular 框架中,用于在任何地方给新建的组件提供服务或所需的其它东西。 可以将服务注入到一个组件中,从而使这个组件类可以访问这个服务类。

在Angular中,定义一个服务类,用@Injectable() 装饰器来提供元数据,这个Angular就可以把它作为依赖注入到各个组件中。同样,也要使用@Injectable()装饰器来表明一个组件或者其他类(服务,管道或者NgModule)拥有的一个依赖。

在Angular中不用自己创建Angular的注入器,Angular会在启动过程中会创建全应用级别的注入器以及所需的其他注入器。这个注入器会创建依赖,维护一个容器来管理这些依赖,并尽可能的去复用它们,

在 Angular 中,要把一个类定义为服务,就要用 @Injectable() 装饰器来提供元数据,以便让 Angular 可以把它作为依赖注入到组件中。 同样,也要使用 @Injectable() 装饰器来表明一个组件或其它类(比如另一个服务、管道或 NgModule)拥有一个依赖。提供商是一个对象,用来告诉注入器应该如何获取或创建依赖。

在整个应用中所需要的任何依赖,都必须使用这个应用的注入器来注册一个提供商,这样方便注入器可以使用这个提供商来创建新实例。对于服务来说,这个提供商通常就是服务类本身。

注意:依赖不一定是服务 —— 它还可能是函数或值

当Angular创建一个组件类的新实例的时候,它会通过查看这个组件类的构造函数,来决定这个组件依赖那些服务或者其他的依赖项。

就像这样:

constructor(private heroService: HeroService) { }

当Angular发现某个组件对某个服务有依赖的时候,它会首先检查一下这个注入器是否已经有了那个服务的任何现有实例。如果请求的服务还不存在,注入器就会使用之前注册的服务提供商来制作一个,并把它加入注入器中,然后把这个服务返回给Angular。当所有的请求的服务已经解析并返回时,Angular可以用这些服务实例当作参数,跳用这个组件的构造函数。

提供服务

对于要用到的任何服务,至少注册以恶搞提供商,服务可以根据足迹的元数据中把自己注册为提供商,这样可以让自己随处可用。或者,也可以为特定的模块或者组件注册提供商。要注册提供商,就要在服务的@Injectable()装饰器中提供它的元数据,

默认情况下,Angular CLI 的 命令:

ng generate service

 会在 @Injectable装饰器中提供元数据来把它注册到根注入器中。

@Injectable({
  providedIn: 'root',
})

或者在@NgModule()或者@Compotent()的元数据【providers】中:当在组件级注册提供商时,这个组件的每一个新实例提供该服务的一个新实例。 要在组件级注册,就要在 @Component() 元数据的 providers 属性中注册服务提供商。

@NgModule({
  providers: [
   // 各种service
 ],
 ...
})

猜你喜欢

转载自blog.csdn.net/wjyyhhxit/article/details/84503381