构造函数注入

类具有实例变量(依赖项),它们在其上调用方法。

示例来自 http://www.jamesshore.com/Blog/Dependency-Injection-Demystified.html 以供参考

public class Example { 
  private DatabaseThingie myDatabase; 

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

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

这个类有一个名为 DatabaseThingie 的依赖项。在此示例中,类 Example 负责创建自己的依赖项,从而违反单一责任原则。类具有一些主要责任+它正在创建其赢得的依赖项。如果依赖关系创建机制发生了变化,那么现在让我们说依赖关系参数或者代替 DatabaseThingie,我想要一些其他类型。类会改变。

从外部源注入依赖项

public class Example { 
  private DatabaseThingie myDatabase; 

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

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

这里我们使用构造函数注入从外部源注入依赖项 (在构造函数中传递依赖项)

我们不关心注入什么类型的依赖,我们只是使用它。由于这个原因,类不会改变。

Dependency Injection 的主要好处是编写测试时

public class ExampleTest { 

  void 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(); 
  } 
}