dependency-injection - IoC和DI到底有什么区别

标签 dependency-injection inversion-of-control

<分区>

Possible Duplicate:
Inversion of Control < Dependency Injection

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

最佳答案

在通常情况下,这些术语在某种程度上已成为同义词。 IoC 的最初想法——控制反转——与“好莱坞原则”密切相关:不要调用我们,我们会调用你

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

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

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

依赖注入(inject)是一种灵 active 机制,它可以最大化对接口(interface)的依赖,同时最小化对特定实现的依赖。因此,使用依赖注入(inject)的系统可以支持可根据情况使用的“可插入”实现类。这种“可插入性”的一个非常大的好处是它使创建单元测试变得更加容易。您可以模拟一个对象到所需的接口(interface),然后将其注入(inject)您的测试对象。<​​/p>

因此,IoC 实际上是更广泛的原则,而 DI 是其中的一项基本技术。 IoC(好莱坞原则)系统往往非常复杂,难以理解,因此学习曲线陡峭。另一方面,DI 是日常开发人员的良好实践。我倾向于更喜欢易于理解和清晰,而不是酷但复杂。

关于dependency-injection - IoC和DI到底有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4596300/

相关文章:

java - 无需实现接口(interface)即可提供 OSGi 服务

c# - IDisposable 模式的一个有问题的例子?

wpf - WPF MDI 应用程序中的组合根在哪里?

android - 实现 DI 时是否应该注入(inject) viewholder?

php - 是否可以将 YAML 文件注入(inject) Symfony 中的服务?

c# - IServiceProvider 不返回单例实例

javascript - 为什么我的 Angular 测试 $scope 上没有定义方法?

java - 使用finalize方法进行spring bean生命周期管理?

unit-testing - 单元测试 IoC 注册?

c# - 静态存储库 - 解决方法