c#之控制反转(IOC)和依赖注入(DI)的理解

这两个东西曾经困扰很多新手朋友,下面就给大家详细介绍一下!

首先说控制反转(IOC)

控制反转不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击自己去找,但是在IoC思想中,应用程序就变成被动的了,被动的等待调用方来创建并注入它所需要的资源了。

简单的说就是:“别找我们,我们找你”;

下面用一个简单的例子来讲解让大家更容易理解。

下面是一段演示代码:


c#之控制反转(IOC)和依赖注入(DI)的理解

在shop类中, Log4NetServices是一个日志类,_logServices直通过new Log4NetServices()实例化,日志记录会自动保存数据库中。

现在问题来了,领导要求日志要到文件中去,两种解决办法:

1、修改shop类。

<code>_logServices=new FileLogServices()/<code>

这样改有下面几个问题。

1.1、后续如果要改为数据库保存日志,又要去改shop类。

1.2、如果有的日志要保存数据库,有的日志要保存在文件,也要修改shop类。

当一个类会出现类似的需求的时候,我们就需要用到这个依赖注入这个思想。就是_logServices由谁来实例化,不要在shop中来定义,而是由调用方来实现。

改进后的代码如下:


c#之控制反转(IOC)和依赖注入(DI)的理解

在shop类中,_logServices只是一个ILogServices接口,没有具体的实现,由调用方来实现。

通过上面改进,就可以实现灵活的扩展,对于不复杂的应用,这种改进已经足够用了,但是有一天程序越来越庞大,参与的人越来越多的时候,就会出现下面的问题:

1、参与的人多了,每个人调用时候都一个个的new。

2、ILogServices出现更多的实现(如保存成excle,保存为txt,保存到缓存等等),也就是种类多了,调用方需要一个一个的new。

当业务变庞大以后,架构师就要考虑这个问题,能不能new统一起来管理,需要的人统一从一个固定的地方获取呢?

然后依赖注入框架出现了。

DI依赖注入(Dependency Injection)

网上有很多描述,我自己都看的云里雾里的,最后也不知道说什么,下面用我的话来总结:

类和类之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到类之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率。

简单的说就是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”

●谁依赖于谁:当然是应用程序依赖于IoC容器;

●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

目前有很多成熟的IOC框架,如unity和Auotfac,这两个框架网上都有详细的使用配置教程,这里就不讲解了。因为在在NetCore后,框架已经可通过ServiceProvider类和ServiceCollection类实现依赖注入,代码如下:

c#之控制反转(IOC)和依赖注入(DI)的理解

总结

使用IoC对于复杂的项目来说,非常有意义,能够为我们搭建一个好的开发层次。


分享到:


相關文章: