转载本文务必须注明出处、微信号(Yemeir_com)、以及添加原文链接。
为什么要使用依赖注入
使用依赖注入(DI)可以使控制者与抽象实现者松耦合,便于单元测试。通过控制反转(IOC)的设计原理来减少不同技术的依赖,并写出通用的代码。
依赖注入简单理解就是:依赖于抽象,不依赖于具体实现。我们可以把“将具体实现传递的过程”看成注入。
未使用依赖注入
从代码中我们可以看出来,LoginController与LoginService是紧耦合。这种耦合是不利于扩展的。试想一下:假如LoginService服务需要同时提供Http Api以及更多的其他服务我们将怎么处理?
无非去增加一个ApiLoginService的服务,然后增加一个ApiMethod方法,最后实例化ApiLoginService去调用ApiMethod()。由上到下全得改。那我们使用依赖注入和控制反转怎么实现。
使用依赖注入
以上代码定义了一个ILoginService接口,Loginservice继承了该接口,并实现了Run方法。LoginController中构造函数接受ILoginService注入,这就是所说的依赖于抽象,而并非依赖于ILoginService实现类Loginservice。
在Main函数中我们实例化LoginController并将LoginService具体的实现传进去。
现在我们假如有一个API的服务我们怎么做:编写ApiLoginService继承ILoginService并实现Run方法,最后我们是不是就只需要把Main()中的new LoginService()替换成newApiLoginService()就可以了,不再需要去改动LoginController类中的方法.
以上代码利用了控制反转的思想。下面讲讲什么是控制反转。
控制反转
控制反转并不属于代码上的改变,而是思路上的改变。LoginController中并没有像代码1里面所示需要实例化LoginService,而需要使用的该实例由外部传入,这就是控制反转。
用一段对话更容易理解:
LoginController说:依赖ILoginService接口\抽象的构造函数已经准备完毕,请通过我的构造函数注入。请问下一步怎么做。
Main说:你别管具体实现,我会把具体实现传给你。
关于依赖注入容器的相关知识,我将在下一篇文章中讲到。
如果喜欢请关注支持笔者,您的关注是笔者源源不断创作的动力!
转载本文务必须注明出处、微信号(Yemeir_com)、以及添加原文链接