IoC和DI之间的区别究竟在哪里

Sys*_*ata 36 dependency-injection inversion-of-control

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

我总是在相同的上下文中读取IoC(控制反转)和DI(依赖注入).IoC和DI有什么区别?IoC与DI有何不同?

BJ *_*die 69

在通常的用法中,这些术语已成为一些同义词.IoC的最初想法 - 控制倒置 - 与"好莱坞原则:" 不要打电话给我们,我们会打电话给你.

在传统应用程序中,开发人员会编写业务代码和框架代码.然后,业务代码将调用框架代码来完成任务.在IoC模型下,您"反转"该模型并创建一个接受业务模块并调用它们来完成任务的框架.该原则在几个开发框架中展示,包括旧的智能客户端软件工厂和较新的Prism(或WPF/Silverlight的复合应用程序).在这些模型中,UI模块在IoC容器中注册,并根据配置和用户操作根据需要加载.虽然功能强大,但这些模型也往往具有非常陡峭的学习曲线.

依赖注入是一种通过允许外部调用者将依赖对象注入到类/方法中来从实现中删除内部依赖性的技术(很难称之为模式).IoC框架使用依赖注入将用户模块和其他依赖代码提供给"将它们粘合在一起"的框架例程.依赖注入被IoC框架大量使用,因为这是允许它们"呼叫你"的机制.

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

依赖注入是一种灵活性机制,可最大限度地减少对接口的依赖,同时最大限度地减少对特定实现的依赖.因此,使用依赖注入的系统可以支持可根据环境使用的"可插拔"实现类.这种"可插拔性"的一个非常大的好处是它可以更轻松地创建单元测试.您可以将对象模拟到所需的接口,然后将其注入到测试对象中.

因此,IoC确实是更广泛的原则,DI是其中的基本技术.IoC(好莱坞原则)系统往往相当复杂,难以理解,因此具有陡峭的学习曲线.另一方面,DI对于日常开发人员来说是一个很好的做法.我倾向于更容易理解和清晰,但很复杂.


Tim*_*oyd 57

IoC是改变合同执行的能力.

DI是提供实施的能力.