控制反转与依赖注入

【https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC】

控制反转[编辑]

维基百科,自由的百科全书

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

目录

   [隐藏] 
  • 1起源
  • 2技术描述
  • 3实现方法
    • 3.1依赖注入
    • 3.2依赖查找
  • 4控制反转应用实例
    • 4.1C++
    • 4.2Java
    • 4.3.NET
    • 4.4PHP
  • 5参考文档
  • 6外部链接
  • 7参考文献

起源[编辑]

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

技术描述[编辑]

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

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

实现方法[编辑]

实现控制反转主要有两种方式:依赖注入和依赖查找。两者的区别在于,前者是被动的接收对象,在类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 的 Dynamo 应用程序服务器是第一个利用这途径的环境之一,近来关于这些容器的例子包含了 HiveMind、PicoContainer、Spring Framework(注意 Spring 是一个完整的企业平台,而非 IOC容器)、Apache Excalibur、Seasar 和 DPML Metro.

.NET[编辑]

  • Ninject
  • Spring.NET
  • ObjectBuilder
  • Structuremap
  • CastleProject
  • Seasar

PHP[编辑]

  • Phalcon PHP 框架中应用了依赖注入:DI in Phalcon

参考文档[编辑]

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

外部链接[编辑]

  • 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

参考文献[编辑]


你可能感兴趣的:(架构)