今天来学习下IoC的概念,IoC是随着近年来轻量级容器的兴起而逐渐被很多人提起的一个名词,它的全称为Inversion of Control,中文通常翻译为“控制反转”,它还有一个别名叫做依赖注入(Dependency Injection)。
0x01 通灵之术-IoC
IoC让我想起火影忍者里面的通灵之术。先回忆一下火影里面的场景,漩涡鸣人可以使用通灵之术,一结手印将蛤蟆召唤出来,卡卡西也可以使用通灵之术将那个狗狗召唤出来。简单来说:
通灵之术可以将其他帮手召唤到当前的环境来,然后执行任务。
这个听起来是不是很酷。有了通灵之术之后,我们不需要在执行任务的时候,再去学习新技能或者构造一个帮手,而仅仅需要将帮手召唤出来。你可能只需要结手印,或者使用卷轴帮助你完成通灵之术的召唤。
事实上,程序员能够做的事情更多更酷。不仅可以随意召唤对象出来,还可以随意创建和毁灭对象,还可以轻松复制多个对象(丝毫不逊于鸣人的影分身)。
IoC使用了好莱坞原则“Don’t call us, we will call you.”也即是说,我在需要的时候,会把你召唤出来,在之前,你不用来找我。
再仔细想想,我们需要的根本不是具体的对象,而是一项明确的服务。例如,我家装修,需要打孔,我不需要一个打孔机或者一个会打孔的师傅,而是这个打孔的服务。
于是,我只需要打电话给打孔公司,然后让他们安排帮我打孔就可以了。我不关心谁过来,打孔机是新的还是老的,什么牌子。
所以,我在召唤的时候,通常是召唤这项服务(也就是接口,而不是具体类),我不关心具体的实现类是谁,只要你实现了这个接口,能够提供这项服务即可。
实际上,IoC做的,就是为了帮助我们避免创建对象、管理对象相关的各种繁琐事,它的反转,就反转在你不需要原来的事必躬亲,而只需要享受别人提供给你的服务即可。
使用IoC前后的差别0x02 通灵之术的背后 -- IoC Service Provider
IoC Service Provider -- IoC服务的提供者。有了通灵之术之后,你只需要结印召唤,就可以把业务对象给召唤出来了。你不需要自己去创建,不需要知道里面的细节,你就可以安心使用服务。
如果要做到知其然,知其所以然的话,你还需要思考下,如何创建这些待召唤的对象,这些被召唤的对象保存在哪里?肯定需要有一个容器(卷轴),也就是IoC容器里面。还需要知道哪些手印对应这哪些对象,哪些对象还需要依赖其他对象的帮助......
做这些工作就需要有一个角色,也就是 IoC Service Provider。
很明显, IoC Service Provider的职责肯定是以下两个:
- 业务对象的构建管理
- 业务对象之间的依赖绑定。
小结:
IoC,也就是控制反转,你需要什么,让被人提供给你,而不需要自己费心去创建。
网友评论