IoC和依赖注入的实用性

时间:2010-03-07 01:10:51

标签: dependency-injection inversion-of-control

some cases单元测试对项目不起作用。

我正在研究控制和依赖注入实用程序的反转,我想知道是否有充分的理由使用它比使单元测试更容易。

- 更新

好的,让我们分析一下引用的优点:减少耦合。 从子类型中取出耦合,然后将耦合添加到需要创建要注入的对象的处理程序类型。

没有单元测试,这种耦合传输的优势是什么(不是耦合消除)。

5 个答案:

答案 0 :(得分:5)

IOC / DI为您的应用带来了一些非常重要的功能

  • 可插拔性:使用DI,您可以将依赖注入代码,而无需明确了解功能的实际工作方式。 例如:您的类可能会注入一个ILog接口,以便它可以写入日志。由于该类使用ILog接口,因此可以实现FileLog,MemoryLog或DatabaseLog&把它注入你的班级。只要实现ILog接口
  • ,任何这些实现​​都可以正常工作
  • 可测试性:在类中使用DI,您可以注入模拟对象来测试类的行为,而无需实际需要具体实现。 例如:考虑一个需要存储库来执行数据操作的Controller类。在这种情况下,存储库可以是控制器的DI。如果需要在Controller类上编写测试,则可以传递DI'd模拟版本的存储库,而无需使用实际的存储库类
  • 可配置性:一些常见的DI框架,如Castle Windor,Unity,Spring等,允许进行DI以及创建对象的生命周期管理。这是一个非常强大的功能&允许您管理依赖关系&通过配置他们的一生。例如,考虑您的应用程序需要ICache依赖项。通过配置终身&对象管理,您将能够将缓存配置为每个应用程序或每个会话或每个请求等,而无需在代码中明确烘焙实现。

HTH

答案 1 :(得分:3)

IoC降低coupling,与某些studies中的缺陷率相关。 (如果真的很长的链接不起作用,那就是Ronald Kirk Kandt的软件工程质量实践。)

答案 2 :(得分:2)

当然,原因如下:

  1. 动态生成远程处理和事务处理代理
  2. 面向方面编程
  3. 使用接口分层和实现分离
  4. 足够?

答案 3 :(得分:2)

是的,依赖注入可以帮助您使您的课程更集中,更清晰*,更容易更改,因为这样可以更轻松地遵守single-responsibility principle

它还可以更轻松地相互独立地改变应用程序的各个部分。

特别是当你使用constructor injection时,更容易分辨你的代码需要做什么。如果WeatherUpdater类在其构造函数中需要IWeatherRepository,则没有人会对它使用数据库感到惊讶。

*同样,仅构造函数注入。

答案 4 :(得分:2)

来自IoC维基百科article

  • 某项任务与执行的执行脱钩。
  • 每个系统都可以专注于它的设计目标。
  • 每个系统都不会对其他系统做或应该做的事情做出假设。
  • 更换系统不会对其他系统产生任何副作用。

虽然我会将上述功能列表称为有点模糊,但即使没有测试,您也可以看到上述大部分功能。

如果我不得不简单地说一下,我会说IoC显着改善了关注点的分离,这是软件开发中的一个有价值的目标。