【发布时间】:2013-03-03 17:29:02
【问题描述】:
下面的代码有什么问题?
public class DeDoper {
public boolean wackapediaOkToday() {
DnsResolver resolver = ResolverFactory.getInstance().makeResolver();
return resolver.getIpAddressFor("wackapedia.org").equals("123.456.78.9");
}
}
为什么首选这个版本?
public class DeDoper {
@InjectService
private DnsResolver resolver;
public boolean wackapediaOkToday() {
return resolver.getIpAddressFor("wackapedia.org").equals("123.456.78.9");
}
}
我可以轻松地模拟 ResolverFactory.makeResolver(),这与设置解析器是最新的示例相同。
这是来自 ProQuest.biz 的this article 中所说的:
这个 [第一个] 版本的 WackapediaOkToday 很笼统地说,是“注入”了一个 DnsResolver(尽管它确实不像打针,而更像是向服务员索要支票)。但它确实解决了测试问题,以及“一路乌龟”的问题。
链接到工厂 但是在这个[第一个版本]方法中,我们实际上是“链接”到工厂类的。 (更糟糕的是,如果我们的工厂创建的对象依次具有依赖关系,我们可能不得不在工厂内部引入新工厂。)我们还没有完全“反转”我们的控制,我们仍然从内部调用(控制)工厂我们的班级。
我们需要一种方法来完全摆脱我们类中的控制,并让他们告诉他们得到了什么(对于他们的依赖关系)。
【问题讨论】:
标签: java jakarta-ee dependency-injection inversion-of-control