依赖注入揭秘

简短的版本:

依赖注入意味着给一个对象它的实例变量赋值。

稍微长一点的版本,依赖没有注入:

类中有一些方法调用时使用的东西,我们叫这是是“依赖”,大多数人称之为“变量”,有时称之为“实例变量”。

public class Example { 
  <span style="background-color: rgb(255, 255, 153);">private DatabaseThingie myDatabase; </span>

  public Example() { 
   <span style="background-color: rgb(255, 255, 153);"> myDatabase = new DatabaseThingie(); </span>
  } 

  public void DoStuff() { 
    ... 
    <span style="background-color: rgb(255, 255, 153);">myDatabase.GetData(); </span>
    ... 
  } 
}

这里我们有一个变量或者是依赖,叫做myDatabase,我们在构造函数中初始化它。

稍微长一点的版本,依赖注入:

如果我们想,我们可以将变量传到构造函数中,那就是“注入”这个“依赖”到类中,现在当我们使用这个变量(依赖)时候,我们用的这个变量是给的而不是我们创建的。
public class Example { 
  private DatabaseThingie myDatabase; 

  public Example() { 
    myDatabase = new DatabaseThingie(); 
  } 

<span style="background-color: rgb(255, 255, 153);">  public Example(DatabaseThingie useThisDatabaseInstead) { 
    myDatabase = useThisDatabaseInstead; 
  }</span>

  public void DoStuff() { 
    ... 
    myDatabase.GetData(); 
    ... 
  } 
}

全部的东西都在这了,剩下的变量就成主角了,你可以在setter方法中设置依赖,你可以通过调用定义在特殊接口中的setter方法设置依赖等等。

稍微长一点的版本,为什么要这么做:

在测试时,隔离这些方法很方便
public class ExampleTest { 
  TestDoStuff() { 
    MockDatabase mockDatabase = new MockDatabase(); 

    // MockDatabase is a subclass of DatabaseThingie, so we can 
    // "inject" it here: 
    Example example = new Example(mockDatabase); 

    example.DoStuff(); 
    mockDatabase.AssertGetDataWasCalled(); 
  } 
}

public class Example { 
  private DatabaseThingie myDatabase; 

  public Example() { 
    myDatabase = new DatabaseThingie(); 
  } 

  public Example(DatabaseThingie useThisDatabaseInstead) { 
    myDatabase = useThisDatabaseInstead; 
  } 

  public void DoStuff() { 
    ... 
    myDatabase.GetData(); 
    ... 
  } 
}

依赖注入实际上就是传递实体变量。
还有两篇好文章:
Inversion of Control Containers and the Dependency Injection pattern:http://www.martinfowler.com/articles/injection.html
A beginners guide to Dependency Injection:http://www.theserverside.com/news/1321158/A-beginners-guide-to-Dependency-Injection

原文链接:http://www.jamesshore.com/Blog/Dependency-Injection-Demystified.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值