Dependency Injection

Dependency Injection

        IoC模式基本上是一个高层的概念,在 Martin Fowler 的
Inversion of Control Containers and the Dependency Injection 中谈到,实现IoC有两种方式: Dependency Injection与Service Locator, Castle 所采用的是Dependency Injection 来实现 IoC,中文翻译为依赖注入,依赖注入的意义是:“保留抽象接口,让组件依赖于抽象接口,当组件要与其它实际的对象发生依赖关系时,藉过抽象接口来注入依赖的实际对象。”

看看下面这个程序:

Dependency Injection
Dependency Injection
public
 
class
 BusinessObject 
Dependency Injection

Dependency Injection    
private FloppyWriter writer = new FloppyWriter(); 
Dependency Injection    Dependency Injection
Dependency Injection    
Dependency InjectionDependency Injection    
public void Save() Dependency Injection
Dependency Injection        Dependency Injection 
Dependency Injection        writer.SaveToFloppy(); 
Dependency Injection
Dependency Injection    }
 
Dependency Injection}

 
Dependency Injection
Dependency Injection
Dependency Injection

BusinessObject 依赖于实际的 FloppyWriter,为了让 BusinessObject 获得重用性,不让 BusinessObject 直接依赖于实际的 FloppyWriter,而是依赖于抽象的接口:


Dependency Injection
Dependency Injection
public
 
interface
 IDeviceWriter 
Dependency Injection

Dependency Injection    
public void SaveToDevice(); 
Dependency Injection}

 
Dependency Injection
Dependency InjectionDependency Injection

public
 
class
 BusinessObject 
Dependency Injection

Dependency Injection    
private IDeviceWriter writer; 
Dependency Injection
Dependency Injection    
public DeviceWriter
Dependency InjectionDependency Injection    
Dependency Injection{

Dependency Injection      Set
Dependency InjectionDependency Injection      
Dependency Injection{

Dependency Injection        
this.writer = value; 
Dependency Injection      }

Dependency Injection    }
 
Dependency Injection
Dependency InjectionDependency Injection    
public void Save() Dependency Injection
Dependency Injection        Dependency Injection
Dependency Injection        writer.SaveToDevice(); 
Dependency Injection    }
 
Dependency Injection}

 
Dependency Injection
Dependency InjectionDependency Injection

public
 
class
 FloppyWriter : IDeviceWriter 
Dependency Injection

Dependency InjectionDependency Injection    
public void SaveToDevice() Dependency Injection
Dependency Injection        Dependency Injection
Dependency Injection        
// 实现储存至Floppy的程序代码 
Dependency Injection
    }
 
Dependency Injection}

 
Dependency Injection
Dependency InjectionDependency Injection

public
 
class
 UsbDiskWriter : IDeviceWriter 
Dependency Injection

Dependency InjectionDependency Injection    
public void SaveToDevice() Dependency Injection
Dependency Injection        Dependency Injection
Dependency Injection        
// 实现储存至UsbDisk的程序代码 
Dependency Injection
    }
 
Dependency Injection}

 
Dependency Injection

如果今天BusinessObject想要与UseDiskWriter对象发生依赖关系,可以这么建立: businessObject.SetDeviceWriter(new UsbDiskWriter());

由于BusinessObject依赖于抽象接口,在需要建立依赖关系时,可以通过抽象接口注入依赖的实际对象。

依赖注入在Martin Fowler的文章中谈到了三种实现方式:Interface injection、Setter injection 与 Constructor injection。并分别称其为Type 1 IoC、Type 2 IoC 与 Type 3 IoC。

上面的BusinessObject所实现的是Type 2 IoC,通过属性注入依赖关系,而Type 3 IoC,则在是构造函数上注入依赖关系,例如:


Dependency Injection
Dependency Injection
public
 
class
 BusinessObject 
Dependency Injection

Dependency Injection    
private IDeviceWriter writer; 
Dependency Injection
Dependency InjectionDependency Injection    
public BusinessObject(IDeviceWriter writer) Dependency Injection
Dependency Injection        
this.writer = writer; 
Dependency Injection    }
 
Dependency Injection
Dependency InjectionDependency Injection    
public void Save() Dependency Injection
Dependency Injection        Dependency Injection
Dependency Injection        writer.SaveToDevice(); 
Dependency Injection    }
 
Dependency Injection}

 
Dependency Injection
Dependency Injection

转载于:https://www.cnblogs.com/Jebel/archive/2008/06/13/1219257.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111013.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu14.04源代码安装postgresql 9.1

    ubuntu14.04源代码安装postgresql 9.1

    2022年2月3日
    62
  • Windows许可证即将过期怎么办?

    Windows许可证即将过期怎么办?很多时候我们会遇到自己 Windows 许可证即将过期的问题 很烦人 虽然网上有很多所谓的密钥和一键激活软件 但是我们一般都是下载不到正版的软件 要么下载的都是病毒 FK 安装完之后不但没有给我们激活 反而又给我装了一些垃圾软件和什么全家桶 而且还劫持我的浏览器首页 什么鬼 经过一番查找 个人在网上找到一款比较好的激活软件 不是病毒 但是只能激活 180 天 虽然这么一说 大家可能觉得 180 天太少

    2025年10月17日
    5
  • C++字符串加密_c++字符串连接函数

    C++字符串加密_c++字符串连接函数有的时候,使用C++进行爬虫操作时,会涉及到一些请求参数的加密,例如对utf8的中文进行加密,我们用js对如下字符串进行加密的结果如下:加密前字符串:keras-lx-还魂草.z01URL加密后:keras-lx-%E8%BF%98%E9%AD%82%E8%8D%89.z01使用网页在线加密工具和使用js加密效果是一样的自己用C++写的URL加密代码如下://URL编码.cpp:…

    2025年7月7日
    4
  • JAVA语言程序设计(一)04747

    JAVA语言程序设计(一)04747windows常用快捷键和常见命令省略100万行二进制=>0、1一个字节是八位。每个0或者每个1都叫做是bit二进制的计算,除2除到余数为一,一算到最后一位,结果需要倒过来。上述直接操作字节是计算机中最小的存储单元,计算机储存的任何数据都是以字节的形式存储的。1KB=1024Byte1MB=1024KB命令提示符常用的命令D:可以直接切换到d盘根路径…

    2022年7月7日
    24
  • Depix:还原马赛克工具的试用及总结[通俗易懂]

    Depix:还原马赛克工具的试用及总结[通俗易懂]背景一周前发现git上有个叫Depix的项目非常火,可以用来去除马赛克。好奇之下准备下来试用一下这个工具参考:https://github.com/beurtschipper/Depix算法说明:https://www.linkedin.com/pulse/recovering-passwords-from-pixelized-screenshots-sipke-mellemaDeBruijn序列:https://damip.net/article-de-bruijn-sequence说

    2022年6月15日
    200
  • python字典的操作

    python字典的操作python 字典操作字典 1 花括号定义的 2 python 内置的数据结构之一 与列表一样是一个可变序列 3 以键值对 冒号前的叫键 冒号后的叫值 的方式存储数据 字典是一个无序的序列 即是通过 hash 函数计算而来 4 元素之前用逗号分隔 5 键具有唯一性 不可重复 当键重复的时候不会报错 而是左边的键会被右边的键所覆盖字典实现原理 类似于查字典 不过 python 中的字典是根据 ke

    2025年6月28日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号