上家公司模块间的解耦是通过解析XML+反射实现的,我由于之前学习了《Android源码设计模式》这本书,所以认定它是一种依赖注入,但是有一次面试问我什么是依赖注入及其实现,我不知道了。这是我要写本文的理由。
要学习3个东西:
1.《Android源码设计模式》书上的那一章节
2.控制反转与依赖注入的概念
3.依赖注入的3种实现方式
学习自
https://www.cnblogs.com/chenwolong/p/DI.html
依赖倒置
例子:只要有银行卡,不管在哪个ATM机都能取到钱。ATM机是高层模块,银行卡是低层模块。ATM机提供了一个接口,只要银行卡是实现这个接口的,就可以取钱。
这样一来懂了吧——高层模块不依赖底层模块的细节,这是怎么实现的呢?接口。假如你每次实例化的都是具体的类,那么这就是依赖了底层模块。但是如果你依赖的是接口,就不再是依赖底层模块了,这就是依赖倒置。
依赖未倒置的样子
底层模块各自的实现是我们需要了解的
依赖倒置后
抽象出了公共的特性成为一个抽象,高层模块只和这个接口交流。这个接口可以通过外部注入的形式来得到。(说了这么多高层模块是啥,高层模块就是使用者啦 。。。)
优点如下
控制反转
基于上面的依赖倒置,高层模块不再依赖低层模块的细节了,依赖于抽象,但是这个抽象从何而来?可以让使用者手动注入,也可以依赖于容器注入。
依赖注入
先看一个例子
public class Order { private readonly AccessDal dal = new AccessDal();//添加一个私有变量保存数据库操作的对象 public void Add() { dal.Add(); } }
AccessDal是数据库,可以看到,如果不再使用这个数据库了,又要去修改这个类的代码,很不好。所以需要依赖倒置,依赖抽象;控制反转,让第三方容器来注入,其实现就是依赖注入。
可以通过
方法1,构造函数注入
方法2,属性注入
方法3,定义set方法的接口,接口注入
上述都是手动注入,可以通过控制反转Ioc容器来进行,它替你做的工作大致有:
- 动态创建、注入依赖对象。
- 管理对象生命周期。
- 映射依赖关系。
其实无非就是:原来你手动注入的是AccessDal数据库这个类,你现在只需要输入一个String即可,底层会通过反射来自动替我们生成,原理其实很简单。