what is the real use case of dependency injection?
我理解依赖注入,但我真正不理解的是,依赖注入的用途是什么。
正如这里提到的,这有助于轻松测试代码(这是一种非常有用的测试技术,因为它允许模拟或删除依赖项),但是现在有很多模拟框架,如mockito、powermockito,它们可以很好地完成这些工作,而不是为什么要进行依赖项注入?
如果有人能用代码解释,那就太好了。
事先谢谢。
DI作为一种技术的主要用途是:
它导致代码更容易测试(使用模拟)。这意味着为了使用模拟框架(mockito等),您应该使用更多的DI。如果您不使用DI并编写直接实例化对象的代码,那么实际上您不能使用mockito来模拟依赖项。
假设你写代码来演奏管弦乐队。你的主要课程依赖于这么多其他的课程(也许是其他人写的)。
假设你写了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class Orchestra { private Drums drum; private Violin violin; private Guitar guitar; public Orchestra() { drum = new Drum(); violin = new Violin(); guitar = new Guitar(); } public Music play(){ // use above in some way to run your orchestra // start with violin // add some guitar and then bring in the drums too } |
}
现在,您要确保您在
你想在这里模仿
现在让我们使用DI,看看它有什么帮助。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class Orchestra { private Drums drum; private Violin violin; private Guitar guitar; public Orchestra(Drums d,Violin v, Guitar g ) { drum = d; violin = v; guitar = g; } public Music play(){ // use above in some way to run your orchestra } } |
有了这段代码,在您的测试中可以很容易地模拟出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class TestOrchestra { public void testPlay(){ Drum mockDrum = mock(Drum.class); Violin mockViolin = mock(Violin.class); Guitar mockGuitar = mock(Guitar.class); // add mock behaviour to above , here you control precisely what these dependencies will do inside your code Orchestra orch = new Orchestra(mockDrum, mockViolin,mockGuitar); // now play and test your logic } } |
使用DI的第二个优点是它有助于改变程序更大部分的实现,而无需遍历整个代码。
再次提到上面的内容,假设您一直在使用特定类型的吉他(由代码在内部实例化)演奏管弦乐队。
现在你想换一把全新的电吉他,如果没有DI,你就必须打开你的
有了DI,你可以避免所有这些。您只需将新的