angular js中的依赖注入是什么?有什么作用?与不用依赖注入的其他框架相比,有何优点?

大家好,我是IT修真院郑州分院第八期的学员,今天给大家分享一下,题目angular js中的依赖注入是什么?有什么作用?与不用依赖注入的其他框架相比,有何优点?


一、      背景介绍

wiki 上的解释是:依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分。该模式分离了客户端依赖本身行为的创建,这使得程序设计变得松耦合,并遵循了依赖反转和单一职责原则。与服务定位器模式形成直接对比的是,它允许客户端了解客户端如何使用该系统找到依赖。


二、     知识剖析

在Angular中,依赖注入可谓无孔不入。通常在两种场景(函数)下会使用到依赖注入:

1.       工厂方法定义的组件(components):如directive,factory,filter,provider,controller等。这些工厂函数需要注册到某个模块上。controller比较特殊,它虽然也是一种组件,但是特别之处是它与某个DOM元素关联,因此可以注入$scope service,而其他组件只能注入$rootScope service。

所有的供应商都只被实例化一次,也就说他们都是单例的,除了constant,所有的供应商都可以被装饰器(decorator)装饰,value就是一个简单的可注入的值,service是一个可注入的构造器,factory是一个可注入的方法,decorator可以修改或封装其他的供应商,当然除了constant,provider是一个可配置的factory。

2.       模块提供的run/config方法。

Angular在加载模块时经过两个阶段:config和run。传入config函数的方法会在当前模块加载时执行;传入run函数的方法会在所有模块加载结束后执行。因此,在config阶段即可配置多个provider,但是在config阶段,只有provider可以注入,因此自定义的service无法注入到config中,config阶段是对service进行配置的而不是使用service本身。$provide service本身就是一个provider(对于Angular应用来讲相当于一个'元provider'),在模块加载时会调用$provide的provider方法定义一个新的provider。


三、     常见问题

angular中引入依赖注入的方式

<hr size=2 width="100%"noshade style='color:#333333' align=center>

四、      解决方案

隐式注入声明:这种方法最简易,Angular会通过工厂方法的参数名,推断找到依赖的组件,但不能用于js被压缩/混淆的情况,因为这种情况下方法的参数可能被重命名导致Angular无法定位依赖。

显式注入声明:这种方式通过工厂方法的$inject属性声明依赖的组件,主要用于js被压缩/混淆时,变量被重命名的情况。

行内注入声明::最常用且推荐的方式

 


五、编码实战

腾讯视频  PPT


六、拓展思考

与不用依赖注入的其他框架相比,有何优点?

实现程序的高内聚,低耦合。耦合性非常低,也就是说每个对象都可以轻易被替换而不影响其他对象。


七、参考文献

参考一:理解angularjs中的依赖注入

参考二:深入理解angular依赖注入

参考三:angularjs依赖注入解析


八、更多讨论

讨论一:什么适合使用service方法?

service()方法很适合使用在功能控制比较多的service里面。

注意:需要使用.config()来配置service的时候不能使用service()方法

讨论二:Service、Factory、Provider三者区别?

1) 用Factory 就是创建一个对象,为它添加属性,然后把这个对象返回出来。你把 service 传进 controller 之后,在 controller 里这个对象里的属性就可以通过 factory 使用了。

2) Service 是用"new"关键字实例化的。因此,你应该给"this"添加属性,然后 service 返回"this"。你把 service 传进 controller 之后,在controller里 "this" 上的属性就可以通过 service 来使用了。

3) Providers 是唯一一种你可以传进 .config() 函数的 service。当你想要在 service 对象启用之前,先进行模块范围的配置,那就应该用 provider。

4)Factory/service是第一个注入时才实例化,而provider不是,它是在config之前就已实例 化好

讨论三:推荐使用行内注入声明的原因

写法上比显式注入声明更简单明了
比隐式注入声明更可靠(由于Javascript可以被压缩,AngularJS又是通过解析服务名称找到对应Service的,因此Javascript压缩之后AngularJS将无法找到指定的Service,但字符串不会被压缩,因此单独以字符串指定Service的名称可以避免这个问题)

感谢大家观看!

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

获得更多IT技能,请移步官网点击链接直达:http://www.jnshu.com/login/1/22893921

 


猜你喜欢

转载自blog.csdn.net/cjwjyooo/article/details/80724429