依赖注入
iOS 依赖注入(DI)
依赖注入DI: Dependency Injection是控制反转IoC: Inversion of Control的实现方式之一,另外一种是依赖查找DL: Dependency Lookup
什么是依赖注入(Dependency injection)
在StackOverflow上有个问题:如何向一个5岁的小孩解释依赖注入
“When you go and get things out of the refrigerator for yourself, you can cause problems. You might leave the door open, you might get something Mommy or Daddy doesn’t want you to have. You might even be looking for something we don’t even have or which has expired.
What you should be doing is stating a need, “I need something to drink with lunch,” and then we will make sure you have something when you sit down to eat.”
映射到面向对象开发中的就是:高层类(5岁小孩)应该依赖底层基础设施(家长)来提供必要的服务。
依赖倒置解决了高层次模块依赖于低层次模块和细节的问题
Dependency Injection是一个将行为从依赖中分离的技术。允许开发者定义一个方法函数依赖于外部其他各种交互,而不需要编码如何获得这些外部交互的实例。这样就在各种组件之间解耦,从而获得干净的代码,相比依赖的硬编码,一个组建只有在运行时才调用其所需要的其他组件,因此在代码运行时,通过特定的框架和容器,将其所需要的其他依赖组件进行注入,主动推入。
依赖注入可以看成是控制反转(inversion of control)的一个特例。反转的是依赖,而不是其他。“Inversion of Control Containers and the Dependency Injection pattern”
依赖注入与IOC模式类似于工厂模式,是一种解决调用者和被调用者依赖耦合关系的模式。他解决了对象之间的依赖关系,使得对象只依赖于IOC/DI 容器,实现松散耦合,然后在对象创建时,由IOC/DI容器将其依赖的对象注入其内部。
DI 解决的问题
所有的对象都必须创建;或者说:使用对象之前必须创建,但是现在我们可以不必一定遵循这个定律了,我们可以从DI容器中直接获得一个对象然后直接使用,无需事先创建它们。
依赖注入
参考文章:依赖注入
1 | |
构造器注入
构造器注入,即将某个依赖对象传入到构造器中 (在 Objective- C中指 designated 初始化方法) 并存储起来,以便在后续过程中使用:
1 | |
1 | |
属性注入
对于属性注入,nextReminderId 的代码看起来和 self.userDefaults 的做法是一致的。只是这次不是将依赖对象传递给初始化方法,而是采用属性赋值方式
1 | |
方法注入
如果依赖对象只在某一个方法中被使用,则可以利用方法参数做注入:
1 | |
Demo

Demo 中使用依赖注入的方式来为不同的 BioAuthDemoObject 提供不同的对象属性。

基类有相同的方法,只有在运行的时候,才会调用传入的实现
#参考
Dependency Injection, iOS and You
关于IOS依赖注入(DI)那些事
依赖注入
iOS控制反转(IoC)与依赖注入(DI)的实现
objection
typhoon
Objection 与 Typhoon 的协议绑定对比