分享更有价值
被信任是一种快乐

Angular中的依赖注入是什么及怎么应用

文章页正文上

本篇内容介绍了“Angular中的依赖注入是什么及怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!依赖注入简称DI,是面向对象编程中的一种设计原则,用来减少代码之间的耦合度。我们先来看一段代码

classVideo{
constructor(url){}
}

classNote{
video:Video
constructor(){
this.video=newVideo("https://aaaaa.mp4")
}

getScreenshot(){
this.video.getScreenshot()
}
}

constnote=newNote()
note.getScreenshot()

假设我们用一个视频类,它其中有一个方法 getScreenshot 获取截图,在实例化视频类的时候,需要传入一个视频 url 这样的参数。现在有一个笔记类,它需要去调用视频类下的截图方法,那么我们就可以说,笔记类是依赖于视频类的。所以在笔记类的内部,我们就需要去实例化视频类,这样才能在笔记类中获取视频类的实例对象,并且调用它里面的截图方法。上面代码的耦合度过高,并不推荐使用,比方说如果Video的视频地址换了一个,那么在Note中就需要去改变传入的视频url,这样假设要是有更多的类依赖于视频类,那么一旦做出更改,那么所有地方都要跟着改变,非常的不方便。接下来利用依赖注入解决上面的问题:

classNote{
video:Video
constructor(video:Video){
this.video=Video;
}
}

constvideo=newVideo("https://aaaaa.mp4")
constnote=newNote(video)

我们在类的外部去实例化视频类,并且通过参数传递的方式把实例传递给了笔记类,通过这样的方式就能够成功解决耦合度过高的问题,我们把通过参数传递实例的这种方式称为:注入。优点通过依赖注入降低了代码之间的耦合度,增加了代码的可维护性。视频类中的代码更改也不会去影响到笔记类了。在上述实现的过程当中,还是有着一个不是特别理想的地方,就是我们需要在类的外部去实例化视频类,虽然只有这一处,但是我们还是希望视频类的内部再怎么更改,都不会影响外部代码。在 Angular 提供的 DI 框架中,我们就不需要自己去做视频类的实例化操作,它将实现依赖注入的过程隐藏了,对于开发者来说,只需要使用很简单的代码就可以使用复杂的依赖注入功能。在 Angular 的 DI 有四个核心的概念:Dependency:组件要依赖的实例对象,服务实例对象Token:获取服务实例对象的标识,在Angular会维护很多的实例对象,在我们需要获取的时候,就需要通过标识去获取Injector:注入器,负责创建维护服务类的实例对象,并向组件中注入服务实例对象,通过参数的方式传递给各个组件Procider:对象,用于配置注入器,指定创建服务实例对象的服务类和获取实例对象的标识我们先通过Angular提供的基本语法来创建一个注入器1、创建注入器

import{ReflectiveInjector}from"@angular/core"
//服务类
classVideo{}
//创建注入器并传入服务类
constinjector=ReflectiveInjector.resolveAndCreate([Video])

引入ReflectiveInjector其中resolveAndCreate方法用于创建注入器,它接收一个数组,数组中就是需要创建实例对象的类,这个方法会返回一个注入器
2. 获取注入器中的服务类实例对象

constvideo=injector.get(Video)

在injector下有一个get方法,用于传入标识并且获取实例对象,默认标识就是服务类的名称也就是Video这样我们就能够获取到Video的实例对象了,Angular给我们提供的这套DI框架使得我们不需要去手动的实例化某一个类来获得它的实例对象,它会来帮我们完成。2、服务的实例对象为单例模式,注入器在创建服务实例后悔对其进行缓存

constvideo1=injector.get(Video)
constvideo2=injector.get(Video)

console.log(video1===video1)//true

也就是说,无论通过框架获取多少次实例对象,他返回的都是同一个实例对象3、但是我们可以通过创建多个注入器,不同的注入器返回的同一个服务实例化的对象不是同一个

constinjector1=ReflectiveInjector.resolveAndCreate([Video])
constinjector2=ReflectiveInjector.resolveAndCreate([Video])

constvideo1=injector1.get(Video)
constvideo2=injector2.get(Video)

console.log(video1===video1)//false

4、注入器上面存在一个创建子级注入器的方法为 resolveAndCreateChild,这个方法会创建一个子级注入器,父级注入器和子级注入器之间的关系类似于js的作用域链,当前注入器查找不到就会去父级注入器查找,比如:

constinjector=ReflectiveInjector.resolveAndCreate([Video])
constinjectorChild=injector.resolveAndCreateChild([])

constvideo1=injector.get(Video)
constvideo2=injectorChild.get(Video)

console.log(video1===video1)//true

像上面这段代码,我们在创建子级注入器的时候,不传递参数,但是在子级注入器实例化的时候,由于自身不存在 Video 这个服务,它就会去父级查找,当然,就找到了父级的 Video 这个服务并且实例化,所以后面的两个实例化对象相等。“Angular中的依赖注入是什么及怎么应用”的内容就免费云主机、域名介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注云技术网站,小编将为大家输出更多高质量的实用文章!

相关推荐: 怎么使用javascrip和HTML5 Canvas绘制转盘抽奖

本文小编为大家详细介绍“怎么使用javascrip和HTML5 Canvas绘制转盘抽奖”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用javascrip和HTML5 Canvas绘制转盘抽奖”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册