fbpx
维基百科

控制反转

控制反转(英語:Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。

起源 编辑

早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的获得被反转了,因为大多数应用程序都是由两个或是更多的类通过彼此的合作来实现业务逻辑,这使得每个对象都需要获取与其合作的对象(也就是它所依赖的对象)的引用。如果这个获取过程要靠自身实现,那么这将导致代码高度耦合并且难以维护和调试。

技术描述 编辑

Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式地用 new 建立 B 的对象。

采用依赖注入技术之后,A 的代码只需要定义一个 private 的B对象,不需要直接 new 来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(如XML)来指定。

IoC也可以理解为把流程的控制从应用程序转移到框架之中。以前,应用程序掌握整个处理流程;现在,控制权转移到了框架,框架利用一个引擎驱动整个流程的执行,框架会以相应的形式提供一系列的扩展点,应用程序则通过定义扩展的方式实现对流程某个环节的定制,“框架Call应用”。基于MVC的web应用程序就是如此。

实现方法 编辑

实现控制反转主要有两种方式:依赖注入和依赖查找。两者的区别在于,前者是被动的接收对象,在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属性中,而后者是主动索取相应类型的对象,获得依赖对象的时间也可以在代码中自由控制。

依赖注入 编辑

依赖注入有如下实现方式:

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

依赖查找 编辑

依赖查找更加主动,在需要的时候通过调用框架提供的方法来获取对象,获取时需要提供相关的配置文件路径、key等信息来确定获取对象的状态

控制反转应用实例 编辑

C++ 编辑

  • PocoCapsule IoC and DSM framework (页面存档备份,存于互联网档案馆) LGPL开源的,支持完全非侵入C++的控制反转(IoC)及领域特定建模(DSM)容器
  • hypodermic (页面存档备份,存于互联网档案馆) MIT开源协议,Hypodermic是一个基于C++11开发的控制反转(IoC)容器,它为你的C++对象协作提供依赖注入。Hypodermic灵感来自著名的.NET IoC项目Autofac。

Java 编辑

使用Java語言寫成的程式在控制反轉容器(Inversion of Control Container)裡應用了控制反轉(Martin 2004)。軟體需要一個來自容器的物件,而容器自行建構物件和它的附屬物。ATG英语Art Technology Group 的 Dynamo 應用程式伺服器是第一個利用這途徑的環境之一,近來關於這些容器的例子包含了 HiveMind、PicoContainer (页面存档备份,存于互联网档案馆)、Spring Framework(注意 Spring 是一個完整的企業平台,而非 IOC容器)、Apache Excalibur、Seasar 和 DPML Metro.

.NET 编辑

PHP 编辑

  • Phalcon PHP框架中应用了依赖注入:DI in Phalcon (页面存档备份,存于互联网档案馆
  • Laravel PHP框架核心的服务容器支持依赖注入:Service Container

参考文档 编辑

  1. ^ Robert Cecil Martin. Agile Software Development: Principles, Patterns and Practices. Pearson Education. 2002. ISBN 978-0-13-597444-5. 
  2. ^ Robert Cecil Martin. (PDF). [2005-11-15]. (原始内容 (PDF)存档于2004-12-21). 
  3. ^ Martin Fowler. Inversion of Control Containers and the Dependency Injection Pattern. 2004 [2005-11-15]. (原始内容于2020-05-30). 
  4. ^ Sony Mathew. . 2005 [2005-11-16]. (原始内容存档于2005-11-29). 
  5. ^ Ke Jin. . 2007 [2007-11-13]. (原始内容存档于2007-11-15). 

外部链接 编辑

  • A list of "Open Source Inversion of Control Containers (页面存档备份,存于互联网档案馆)"
  • (using Spring framework)
  • Inversion of Control Containers and the Dependency Injection pattern by Martin Fowler (页面存档备份,存于互联网档案馆
  • , a dependency injection (inversion of control) container for Ruby (页面存档备份,存于互联网档案馆
  • Drip IoC (页面存档备份,存于互联网档案馆), a dependency injection (inversion of control) container for PHP4 (页面存档备份,存于互联网档案馆
  • PyContainer (页面存档备份,存于互联网档案馆), a dependency injection (inversion of control) container for Python (页面存档备份,存于互联网档案馆
  • Qt Ioc Container (页面存档备份,存于互联网档案馆), a dependency injection (inversion of control) container for C++ (页面存档备份,存于互联网档案馆
  • , explains the problems that Inversion of control containers try to solve (using Castle Project)
  • PocoCapsule (页面存档备份,存于互联网档案馆) An open source IoC and DSM framework for C++
  • Domain Specific Modeling (DSM) in IoC frameworks (页面存档备份,存于互联网档案馆

控制反转, 此條目需要精通或熟悉计算机科学的编者参与及协助编辑, 請邀請適合的人士改善本条目, 更多的細節與詳情請參见討論頁, 此條目已列出參考文獻, 但因為沒有文內引註而使來源仍然不明, 2021年3月22日, 请加上合适的文內引註来改善这篇条目, 英語, inversion, control, 缩写为ioc, 是面向对象编程中的一种设计原则, 可以用来减低计算机代码之间的耦合度, 其中最常见的方式叫做依赖注入, dependency, injection, 简称di, 还有一种方式叫, 依赖查找, depend. 此條目需要精通或熟悉计算机科学的编者参与及协助编辑 請邀請適合的人士改善本条目 更多的細節與詳情請參见討論頁 此條目已列出參考文獻 但因為沒有文內引註而使來源仍然不明 2021年3月22日 请加上合适的文內引註来改善这篇条目 控制反转 英語 Inversion of Control 缩写为IoC 是面向对象编程中的一种设计原则 可以用来减低计算机代码之间的耦合度 其中最常见的方式叫做依赖注入 Dependency Injection 简称DI 还有一种方式叫 依赖查找 Dependency Lookup 目录 1 起源 2 技术描述 3 实现方法 3 1 依赖注入 3 2 依赖查找 4 控制反转应用实例 4 1 C 4 2 Java 4 3 NET 4 4 PHP 5 参考文档 6 外部链接起源 编辑早在2004年 Martin Fowler就提出了 哪些方面的控制被反转了 这个问题 他总结出是依赖对象的获得被反转了 因为大多数应用程序都是由两个或是更多的类通过彼此的合作来实现业务逻辑 这使得每个对象都需要获取与其合作的对象 也就是它所依赖的对象 的引用 如果这个获取过程要靠自身实现 那么这将导致代码高度耦合并且难以维护和调试 技术描述 编辑Class A中用到了Class B的对象b 一般情况下 需要在A的代码中显式地用 new 建立 B 的对象 采用依赖注入技术之后 A 的代码只需要定义一个 private 的B对象 不需要直接 new 来获得这个对象 而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中 而具体获取的方法 对象被获取时的状态由配置文件 如XML 来指定 IoC也可以理解为把流程的控制从应用程序转移到框架之中 以前 应用程序掌握整个处理流程 现在 控制权转移到了框架 框架利用一个引擎驱动整个流程的执行 框架会以相应的形式提供一系列的扩展点 应用程序则通过定义扩展的方式实现对流程某个环节的定制 框架Call应用 基于MVC的web应用程序就是如此 实现方法 编辑实现控制反转主要有两种方式 依赖注入和依赖查找 两者的区别在于 前者是被动的接收对象 在类A的实例创建过程中即创建了依赖的B对象 通过类型或名称来判断将不同的对象注入到不同的属性中 而后者是主动索取相应类型的对象 获得依赖对象的时间也可以在代码中自由控制 依赖注入 编辑 主条目 依赖注入 依赖注入有如下实现方式 基于接口 实现特定接口以供外部容器注入所依赖类型的对象 基于 set 方法 实现特定属性的public set方法 来让外部容器调用传入所依赖类型的对象 基於构造函数 实现特定参数的构造函数 在新建对象时传入所依赖类型的对象 基于注解 基于Java的注解功能 在私有变量前加 Autowired 等注解 不需要显式的定义以上三种代码 便可以让外部容器传入对应的对象 该方案相当于定义了public的set方法 但是因为没有真正的set方法 从而不会为了实现依赖注入导致暴露了不该暴露的接口 因为set方法只想让容器访问来注入而并不希望其他依赖此类的对象访问 依赖查找 编辑 依赖查找更加主动 在需要的时候通过调用框架提供的方法来获取对象 获取时需要提供相关的配置文件路径 key等信息来确定获取对象的状态控制反转应用实例 编辑C 编辑 PocoCapsule IoC and DSM framework 页面存档备份 存于互联网档案馆 LGPL开源的 支持完全非侵入C 的控制反转 IoC 及领域特定建模 DSM 容器 hypodermic 页面存档备份 存于互联网档案馆 MIT开源协议 Hypodermic是一个基于C 11开发的控制反转 IoC 容器 它为你的C 对象协作提供依赖注入 Hypodermic灵感来自著名的 NET IoC项目Autofac Java 编辑 使用Java語言寫成的程式在控制反轉容器 Inversion of Control Container 裡應用了控制反轉 Martin 2004 軟體需要一個來自容器的物件 而容器自行建構物件和它的附屬物 ATG 英语 Art Technology Group 的 Dynamo 應用程式伺服器是第一個利用這途徑的環境之一 近來關於這些容器的例子包含了 HiveMind PicoContainer 页面存档备份 存于互联网档案馆 Spring Framework 注意 Spring 是一個完整的企業平台 而非 IOC容器 Apache Excalibur Seasar 和 DPML Metro NET 编辑 Ninject 页面存档备份 存于互联网档案馆 Spring NET 页面存档备份 存于互联网档案馆 ObjectBuilder 页面存档备份 存于互联网档案馆 Structuremap 页面存档备份 存于互联网档案馆 CastleProject Seasar 页面存档备份 存于互联网档案馆 Autofac 页面存档备份 存于互联网档案馆 Unity 页面存档备份 存于互联网档案馆 METPHP 编辑 Phalcon PHP框架中应用了依赖注入 DI in Phalcon 页面存档备份 存于互联网档案馆 Laravel PHP框架核心的服务容器支持依赖注入 Service Container参考文档 编辑 Robert Cecil Martin Agile Software Development Principles Patterns and Practices Pearson Education 2002 ISBN 978 0 13 597444 5 Robert Cecil Martin The Dependency Inversion Principle PDF 2005 11 15 原始内容 PDF 存档于2004 12 21 Martin Fowler Inversion of Control Containers and the Dependency Injection Pattern 2004 2005 11 15 原始内容存档于2020 05 30 Sony Mathew Examining the Validity of Inversion of Control 2005 2005 11 16 原始内容存档于2005 11 29 Ke Jin Domain Specific Modeling DSM in IoC frameworks 2007 2007 11 13 原始内容存档于2007 11 15 外部链接 编辑Another description of IOC A list of Open Source Inversion of Control Containers 页面存档备份 存于互联网档案馆 A simple demo of Inversion of Control using Spring framework Inversion of Control Containers and the Dependency Injection pattern by Martin Fowler 页面存档备份 存于互联网档案馆 Needle a dependency injection inversion of control container for Ruby 页面存档备份 存于互联网档案馆 Drip IoC 页面存档备份 存于互联网档案馆 a dependency injection inversion of control container for PHP4 页面存档备份 存于互联网档案馆 PyContainer 页面存档备份 存于互联网档案馆 a dependency injection inversion of control container for Python 页面存档备份 存于互联网档案馆 Qt Ioc Container 页面存档备份 存于互联网档案馆 a dependency injection inversion of control container for C 页面存档备份 存于互联网档案馆 Introducing Castle explains the problems that Inversion of control containers try to solve using Castle Project PocoCapsule 页面存档备份 存于互联网档案馆 An open source IoC and DSM framework for C Domain Specific Modeling DSM in IoC frameworks 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title 控制反转 amp oldid 73468168, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。