接口
在说依赖注入之前,先了解下什么是接口。
我们在学编程的时候都知道,接口的相关规则:)
- 包括数据成员,只能包含方法、属性、事件、索引等成员。
- 名称一般都以“I”作为首字母(当然不这样声明也可以),这也是接口和类的一个区别之一。
- 代码,也就是说,只要在对接口进行声明时指明接口的成员名称和参数就可以了。
- 代码实现接口抽象成员的操作)。
代码依葫芦画瓢。如果是自己练手的代码或者demo,也是没有使用接口。
接口是什么?
接口就是为了更换一个可能过时或者错误的实现而准备的。就想我们的电脑,里面就到处都是接口。usb、内存条、硬盘、电池、键盘...等等都是有各自的接口。我们可以通过硬盘接口换个更大的硬盘或者换个更快的固态硬盘。如果键盘坏了,也可以通过键盘接口买个新的键盘换上去。这就是接口明显的好处。接口也可以理解成大家的约定。约定了特定接口的大小功能等等。
那么我们写代码也是一样,在某些地方可能会经常变动,逻辑会经常修改的地方使用接口约定。下面我们就用硬盘的接口来做示例吧。
首先定义一个硬盘接口。(属性,一个读一个写的方法)
然后我们买了一个200G的硬盘,它实现了上面的接口。
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> read()
{
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">我可以写入数据哦....</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> write(<span style="color: #0000ff;">string</span><span style="color: #000000;"> str)
{
Console.WriteLine(str);
}
}
在电脑中使用这个硬盘。
Console.ReadKey();
}
某天,我们发现这个硬盘太小了,需要换个1T的。(_<),那么买吧。
然后怎么使用了?只要在电脑上的接口直接插上新的硬盘就ok了,其他的什么地方都不用改。
这就是使用接口的好处。当某天我们发现电脑太慢了,我们可以买个固态硬盘,直接在接口使用的地方换上就可以了,其他地方完全不用修改。
这样,我们就可以在不同时期或不同情况下灵活更换继承实现了接口的任何对象,而不用修改其它地方的代码。
又或者说,实现了这个接口的设备就是存储设备。()
依赖注入
在我们了解了什么是接口之后,我们接着来说说今天主要的主题吧。
还是先从例子入手,且是我们学过编程都知道的例子,三层。()
我们先来写个简单的三层伪代码。
DAL:
BLL:
UI:
应该说简单得不能在简单的三层。
就在系统用了一年之后,老板说:”听说oracle很牛逼,大公司都是用的oracle。咱们也换上吧。“。 好,那就换吧。
DAL:
BLL:
不就换个数据库吗?为何修改这么大,要是老板哪天又要换回oracle怎么办?这得好好想个办法。
首先,我们定义一个数据访问的接口。
DAL修改如下:
{
<span style="color: #0000ff;">public <span style="color: #0000ff;">int addOracle(<span style="color: #0000ff;">string<span style="color: #000000;"> str)
{
<span style="color: #008000;">//<span style="color: #008000;">...省略具体实现
<span style="color: #0000ff;">return <span style="color: #800080;">1<span style="color: #000000;">;
}
<span style="color: #008000;">//<span style="color: #008000;">...省略具体实现,如修改 删除 查询
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> add(<span style="color: #0000ff;">string</span><span style="color: #000000;"> str)
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">...省略具体实现</span>
<span style="color: #0000ff;">return</span> <span style="color: #800080;">1</span><span style="color: #000000;">;
}
}
BLL:
UI:
又过一年之后,因为公司不景气。所以又来需求了。老板:”唉,算了。我们还是用MysqL吧。免费的,为公司节省点“。那么我们又要修改了。
首先需要重新写个MysqL的实现。
DAL:
UI实现如下:
我们有没有发现。我们只是在DAL新增了一个MysqL的实现和修改了下UI层的接口构造。其中BLL我们根本就没有动它的。
是的,这样我们就可以说这里的UI对于BLL来说就是”依赖注入“,BLL对于UI来说就是”控制反转“。所以,我觉得依赖注入和控制反转是同一个概念,只是立场不同。
上面,我们看到了虽然BLL层已经不需要变动就可以新增一个数据源的访问。那么我们能不能也不修改UI层呢?
这里就可以用到我们上篇讲的反射了。
然后,不管老板想怎么折腾,我只需要改改配置文件就可以了。甚至都不用动代码。(配置文件)。
本文以同步至《》