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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 银行家算法C++实现

    银行家算法C++实现网上有很多银行家算法的源代码,下面是本人自己写的,基本算法模型参考教材。介绍银行家算法(Banker’sAlgorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉(EdsgerWybeDijkstra)在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。背景简介在银行中…

    2022年7月22日
    12
  • rj45管脚定义_rj45接口定义,rj45插座引脚定义

    RJ45是布线系统中信息插座(即通信引出端)连接器的一种,连接器由插头(接头、水晶头)和插座(模块)组成,插头有8个凹槽和8个触点。RJ是RegisteredJack的缩写,意思是“注册的插座”。在FCC(美国联邦通信委员会标准和规章)中RJ是描述公用电信网络的接口,计算机网络的RJ45是标准8位模块化接口的俗称。rj45插座引脚定义:常见的RJ45接口有两类:用于以太网网卡、路由器以太网接口等…

    2022年4月15日
    49
  • 《画解数据结构》二十五彩图,画解平衡二叉树「建议收藏」

    为什么叫平衡二叉树?而不叫二叉平衡树呢?

    2022年4月11日
    37
  • ThinkPHP中实现微信支付(jsapi支付)流程

    ThinkPHP中实现微信支付(jsapi支付)流程

    2021年10月30日
    39
  • 配置缺省路由_缺省路由下一跳

    配置缺省路由_缺省路由下一跳缺省路由(默认路由),易目的网络为0.0.0.0,子网掩码为0.0.0.0的形式出现。应用缺省路由可减少路由表的规模,减少维护压力。如下图对于交换机A而言,要去往交换机B所直连的PC1\PC2,就需要有路由的指引。如果我们配置静态路由的话,就需要在交换机A上配置两条静态路由。即增加了配置工作量,又增加了交换机A的负担。因为交换机需要维护更多的路由条目,而承载路由条目的路由表需要占用设备内存资源。为优化网络设计,在保证路由可达的情况下,可以尽量减少路由表的路由条目。在下图场景下,我们可以配置一条缺省路由

    2025年7月13日
    4
  • STM32F103使用标准库移植RT-Thread标准版的Finsh

    STM32F103使用标准库移植RT-Thread标准版的Finshrtt标准版中stm32的bsp使用的是HAL库,现在想换成标准库。相比于rttnano的移植来说,和标准版的移植还是有不小的差别的,至少我个人这么认为。nano在移植过程中只需要按照#error提示修改好board.c即可。当然如果需要使用finsh的话,你还需要补充完成finsh_board.c和串口的一些信号,具体参见官方文档。整个流程还是相当清晰的,工作量也不大。移植标准版的另一个原因是我想使用ATClient。刚开始我尝试直接向nano版本中进行添加,但似乎…

    2022年5月15日
    45

发表回复

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

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