建構函式注入
類具有例項變數(依賴項),它們在其上呼叫方法。
示例來自 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();
}
}