跳转至

依赖注入与控制反转

依赖注入(Dependency Injection)

在软件工程中,依赖注入(dependency injection)的意思为,给予调用方它所需要的事物。 “依赖”是指可被方法调用的事物。依赖注入形式下,调用方不再直接指使用“依赖”,取而代之是“注入” 。“注入”是指将“依赖”传递给调用方的过程。在“注入”之后,调用方才会调用该“依赖”。传递依赖给调用方,而不是让让调用方直接获得依赖,这个是该设计的根本需求。

注:编程语言层次下,“调用方”为对象和类,“依赖”为变量。在提供服务的角度下,“调用方”为客户端,“依赖”为服务。

该设计的目的是为了分离关注点,分离调用方和依赖,从而提高可读性以及代码重用性。

依赖注射是控制反转的最为常见的一种技术。

依赖注入有如下实现方式: - 基于接口。实现特定接口以供外部容器注入所依赖类型的对象。 - 基于 set 方法。实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。 - 基于构造函数。实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。 - 基于注解。基于Java的注解功能,在私有变量前加“@Autowired”等注解,不需要显式的定义以上三种代码,便可以让外部容器传入对应的对象。该方案相当于定义了public的set方法,但是因为没有真正的set方法,从而不会为了实现依赖注入导致暴露了不该暴露的接口(因为set方法只想让容器访问来注入而并不希望其他依赖此类的对象访问)。

控制反转(Inversion of Control)

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计思路,可以用来减低计算机代码之间的耦合度。

通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递(注入)给它。

之前是使用者自己主动去控制的,现在交给IoC容器去创建和组装了,使用者只需要去IoC容器中找到需要使用的对象就可以了。

对象的构建过程被反转了,所以叫做控制反转。

好莱坞法则

在好莱坞,演员把简历递交给演艺公司后就只有回家等待。由于演艺公司对整个娱乐项目具有完全控制权,演员只能被动地接受电影公司的邀约。“不要给我们打电话,我们会给你打电话(Don‘t call us, we‘ll call you)” 这是著名的好莱坞法则( Hollywood Principle或者 Hollywood Low),IoC完美地体现了这一法则。

所谓的控制反转就是将应用对流程的控制转移到框架(IoC容器)中。在传统面向类库编程的时代,针对HTTP请求处理的流程牢牢控制在应用程序手中。在引入框架之后,请求处理的控制权转移到了框架手中。

IoC容器.net篇 - Ninject - Castle - Autofac - Unity

总结

  • 依赖倒置是面向对象的设计原则。
  • 控制反转是实现依赖倒置原则的一种代码设计思路。
  • 依赖注入是实现控制反转的一种方式。

最后更新: 2022-05-06
回到页面顶部