构造函数注入
类具有实例变量(依赖项),它们在其上调用方法。
示例来自 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();
}
}