以下代码有什么问题?
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的这篇文章中所说的:
WackapediaOkToday 的 [第一个] 版本非常笼统地说,是“注入”了一个 DnsResolver(尽管公认它不太像打针,而更像是向服务员索要支票)。但它确实解决了测试问题,以及“一路乌龟”的问题。
链接到工厂 但是在这个 [第一个版本] 方法中,我们实际上是“链接”到工厂类。(更糟糕的是,如果我们的工厂创建的对象依次具有依赖关系,我们可能必须在工厂内部引入新工厂。)我们还没有完全“反转”我们的控制,我们仍然从内部调用(控制)工厂我们的班级。
所需要的是一种完全摆脱我们类中的控制的方法,并让他们告诉他们正在得到什么(对于他们的依赖项)。