我仔细阅读了关于依赖注入(DI)的文章,觉得很有趣。目前为止,我完全可以不用它。
我看到的所有例子都与JNDI相关,并说明DI如何帮助您更具灵活性。
请提供一些在实际生活中使用DI解决的应用程序/问题的示例,这些问题在其他方式下很难解决。
更新
迄今为止,所有答案都是教育性的,但重新表达问题,我正在寻找你编程生涯中的示例,使您说“这个问题最好使用DI框架来解决”。
我仔细阅读了关于依赖注入(DI)的文章,觉得很有趣。目前为止,我完全可以不用它。
我看到的所有例子都与JNDI相关,并说明DI如何帮助您更具灵活性。
请提供一些在实际生活中使用DI解决的应用程序/问题的示例,这些问题在其他方式下很难解决。
更新
迄今为止,所有答案都是教育性的,但重新表达问题,我正在寻找你编程生涯中的示例,使您说“这个问题最好使用DI框架来解决”。
这并不意味着这是一个不好的概念。但说真的,当一个实例A需要与另一个实例B一起工作时,它归结为以下选择:"依赖注入"是一个5美分概念的25美元术语。
让A找到B:
这意味着B必须是全局的。邪恶。
让A创建B:
如果只有A需要B,那么这样做没问题。一旦C也需要B,则将A替换为C。请注意,测试用例将成为C,因此如果您想进行测试,则已经无法选择此选项。
将B提供给A:
这就是依赖注入。
昨天我在公交车上发现了一部手机。失主对于拥有她手机的人毫无头绪。我打电话给她的父亲告诉他我有他女儿的手机。所以我将我的依赖注入到了他身上。这通常是好莱坞原则的一个例子:“不要打电话给我们(因为你不能!),我们会打电话给你”。后来他来取回了他女儿的手机。
我认为,依赖注入并不是解决问题的唯一方式,我们还可以使用工厂等其他方式来解决这些问题。因此,对于你的问题没有一个真正的答案,因为依赖注入只是其中一种方式。它只是一种非常时髦、优雅的方式。
当我有需要 DAOs 的 SQLMapper 时,我真的很喜欢依赖注入。我只需要将不同的 mapper 注入到父类中一次,其余的就由配置完成了。这为我节省了很多时间和代码行数,但我仍然不能说这是一个没有其他解决方案的问题。
DI允许您创建应用程序,可以在不触及代码库本身的情况下进行配置和重新配置。这不仅限于URL或设置;通用对象可以在代码中编写,然后通过XML文件进行“定制”或配置,以实现所需的特定结果。
例如,我可以创建一个RegexDetective类,在其中提供实际的正则表达式,然后在我的Spring DI XML文件中,为前往伦敦的SleuthApp部署定义一个RegexDetective.setRegex()实际的正则表达式。然后几天后,我可以回去更新XML文件中的正则表达式,以便为前往西伯利亚的SleuthApp另行部署。
DI还允许以类似的方式在XML之外定义接口的特定实现,以修改应用程序的行为,而无需实际触及代码,例如在DI XML文件中设置Detective接口的AngryDetective或ArcticDetective实现。
var myRegex = new Regex(SleuthAppSettings.Regex);
——完成... - Timwivar detective = SleuthAppSettings.UseAngryDetective ? (IDetective) new AngryDetective() : new ArcticDective();
— 在计算机编程领域中已经有50多年的历史了... - Timwi我主要使用 DI 来方便测试。此外,它还促进了通过模拟服务调用来提供隔离和独立于服务开发实现的模型。