IoC和DI之间的区别到底在哪里?

40

可能是重复问题:
控制反转 < 依赖注入

我经常在相同的上下文中阅读关于IoC(控制反转)和DI(依赖注入)的内容。究竟IoC和DI之间有什么区别?IoC与DI有何不同之处?


1
重复问题:https://dev59.com/LHA75IYBdhLWcg3wkJ71 - Mark Seemann
3
这里实际上不需要 C# 标签。 - KNU
2个回答

72

通常情况下,这些术语已经变得有些近义词了。IoC - 控制反转 的原始想法与“好莱坞原则”非常相关:不要打电话给我们,我们会打电话给你

在传统应用程序中,开发人员编写业务代码和框架代码。然后业务代码调用框架代码来完成任务。在 IoC 模型下,您可以 "反转" 该模型并创建一个框架,该框架接受业务模块并调用它们来完成任务。这个原则体现在几个开发框架中,包括旧的Smart Client Software Factory和新的Prism(或 WPF / Silverlight 的组合应用)。在这些模型中,UI 模块被注册到 IoC 容器中,并根据配置和用户操作的需要进行加载。虽然功能强大,但这些模型也往往具有非常陡峭的学习曲线。

依赖注入是一种从实现中删除内部依赖关系的技术(实际上很难称之为模式),允许外部调用者将依赖对象注入到类/方法中。IoC 框架使用依赖注入向框架例程提供用户模块和其他相关代码,从而“将它们全部粘合在一起”。依赖注入在 IoC 框架中得到广泛使用,因为这是允许框架 “打电话给你”的机制。

IoC 容器(如 Castle Windsor 和 Structure Map)通过提供注册的类的自动实例化和生命周期管理来帮助实现依赖注入,包括注册类所需的参数的自动实例化和注入。所有这些都使使用依赖注入变得更容易,但不是必需的。

依赖注入是一种灵活性机制,最大限度地依赖接口,同时最小化对特定实现的依赖。因此,使用依赖注入的系统可以支持可插拔的实现类,具体使用取决于情况。这个“可插拔性”的很大的好处是,它使创建单元测试变得更加容易。您可以模拟一个对象到所需的接口,然后将其注入到测试对象中。

因此,控制反转(IoC)实际上是更广泛的原则,而依赖注入(DI)是其中的一种基本技术。采用IoC(好莱坞原则)的系统往往非常复杂,难以理解,因此具有陡峭的学习曲线。另一方面,DI对于日常开发人员来说是一个好的实践。我倾向于选择易于理解和清晰明了的方式,而不是复杂的酷炫风格。


真的很有帮助! - Zaeem Sattar

58

控制反转(IoC)是一种可以改变合同实现的能力。

依赖注入(DI)是一种提供实现的能力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接