建構函式注入

類具有例項變數(依賴項),它們在其上呼叫方法。

示例來自 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(); 
  } 
}