angular依赖注入的三种方式,Angular依赖注入

  angular依赖注入的三种方式,Angular依赖注入

  本文带你了解依赖注入,介绍依赖注入解决的问题及其原生编写,谈Angular的依赖注入框架,希望对你有帮助!

  最近我们经常在Angular项目中遇到关键词依赖注入,但还是不明白是怎么实现的。在Angular的官网上,只有关于它的使用,详细的原理并没有说明,那么就从原生编写来说明一下,依赖注入是用来解决什么问题的,在js中应该如何表达。【相关教程推荐:《angular教程》】

  

依赖注入是什么

  依赖注入(Dependency Injection),简称DI,是面向对象编程中的一种设计原则,用于降低代码之间的耦合度。

  我们先来看一段代码。

  课堂视频{

  构造函数(url){}

  }

  课堂笔记{

  视频:视频

  构造函数(){

  this.video=新视频( https://aaaaa.mp4 )

  }

  getScreenshot(){

  this.video.getScreenshot()

  }

  }

  const note=new Note()

  note . get screenshots()假设我们使用一个video类,它有一个get screen down的方法来获取屏幕截图。当实例化video类时,我们需要传入一个参数,比如视频url。现在有一个note类需要调用video类下的截图方法,所以我们可以说note类依赖于video类。所以在note类内部,我们需要实例化video类,这样就可以在note类中获取video类的实例对象,调用里面的截图方法。

  以上代码耦合度太高,不建议使用。例如,如果更改了视频的视频地址,则需要在Note中更改传入视频的url。这是假设如果更多的课依赖于视频课,那么一旦改变,所有的地方都要改变,非常不方便。

  接下来,使用依赖注入来解决上述问题:

  课堂笔记{

  视频:视频

  构造器(视频:视频){

  this.video=Video

  }

  }

  const video=新视频( https://aaaaa.mp4 )

  Const note=new note(video)我们在类外实例化video类,通过参数传递将实例传递给Note类。这样就可以成功解决高耦合的问题。我们把这种通过参数注入传递实例的方式称为。

  优点

  依赖注入降低了代码之间的耦合度,增加了代码的可维护性。video类中的代码更改不会影响note类。

  

Angular的DI框架

  在上述实现的过程中,还有一点不是特别理想,就是我们需要在类外实例化视频类。虽然只有这一件事,但是我们还是希望不管视频类内部怎么改,都不要影响到外部代码。

  在Angular提供的DI框架中,我们不需要自己实例化video类。它隐藏了实现依赖注入的过程。对于开发者来说,只需要简单的代码就可以使用复杂的依赖注入函数。

  Angular的DI中有四个核心概念:

  依赖:组件所依赖的实例对象,以及服务实例对象。

  Token:获取服务实例对象的标识符。许多实例对象将保持角度。当我们需要获取它时,我们需要通过标识符来获取它。

  注入器:注入器,负责创建维护服务类的实例对象,将服务实例对象注入到组件中,并以参数的方式传递给各个组件。

  Procider: object,用于配置注入器,指定服务类创建服务实例对象,获取实例对象的标识。

  

Injector注入器

  让我们首先通过Angular提供的基本语法创建一个注入器。

  1.创建一个注射器

  从“@angular/core”导入{ ReflectiveInjector }

  //服务类别

  班级视频{}

  //创建一个注入器并将其传递给服务类

  反射注射器。resolveAndCreate ([video])引入了反射注入器,其中resolveAndCreate方法用于创建注入器。它接收一个数组,该数组是需要创建实例对象的类。该方法将返回一个注入器。

  2.获取注入器中的服务类实例对象。

  const Video=injector . get(Video)injector下面有一个get方法,用来传入标识符,获取实例对象。默认标识符是服务类别的名称,即视频。

  这样,我们就可以得到视频的实例对象。Angular提供的DI框架让我们不需要手动实例化一个类来获取它的实例对象,它会帮助我们完成。

  2.服务实例对象是单例模式,注射器后悔在创建服务实例时缓存它。

  const video1=injector.get(视频)

  const video2=injector.get(视频)

  console . log(video 1==video 1)//true也就是说,无论通过框架获取多少次实例对象,都会返回同一个实例对象。

  3.但是我们可以创建多个注入器,不同注入器返回的同一个服务实例化对象是不一样的。

  const injector 1=reflective injector . resolve andcreate([视频])

  const injector 2=reflective injector . resolve andcreate([视频])

  const video1=injector1.get(视频)

  const video2=injector2.get(视频)

  console . log(video 1==video 1)//false 4。在注入器上创建子注入器有一个方法,就是resolveAndCreateChild。这个方法将创建一个子注入器。父注入器和子注入器之间的关系类似于js的作用域链。如果找不到当前注射器,请转到父注射器,例如:

  const injector=reflective injector . resolve andcreate([视频])

  const injector child=injector . resolveandcreatechild([])

  const video1=injector.get(视频)

  const Video 2=injector child . get(Video)

  console . log(Video 1==Video 1)//true和上面的代码一样,当我们创建子注入器的时候,我们不传递参数,但是当子注入器被实例化的时候,它会去父注入器那里寻找视频服务,因为它不存在。当然,父视频服务被找到并被实例化,所以两个实例化的对象是相等的。

  

总结

  本文介绍依赖注入所解决的问题,以及其原生编写是为了什么。还介绍了Angular提供的DI框架,用其简单的api实现了实例化过程,并对注入器进行了说明,注入器也是层次化的,可以为我们提供更好的项目设计方法。之后,我将有机会解释provider和更多的扩展。

  有关编程的更多信息,请访问:编程视频!也就是什么是依赖注入?如何用Angular实现?更多详情请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: