DI容器的关键是抽象。DI容器为您抽象了此设计问题。您可能会猜到,它对代码有显着影响,通常会转化为更少的构造函数,设置方法,工厂和构建程序。结果,它们使您的代码更加松散地耦合(由于底层的IoC),更加简洁。虽然并非没有代价。
背景资料
多年前,这种抽象要求我们编写各种配置文件(声明性编程)。看到LOC数量显着减少是很奇妙的,但是当LOCS减少时,配置文件的数量略有增加。对于中小型项目,这根本不是问题,但是对于大型项目,将“代码汇编”分散在代码和XML描述符之间的50%成为一个难题。范式本身。这是非常不灵活的,因为描述符为定制保留了很少的空间。
范式逐渐向配置约定转变,该约定将配置文件交换为注释或属性。它使我们的代码更干净,更简单,同时为我们提供了XML所无法提供的灵活性。
到目前为止,这可能是您工作方式上最重要的区别。更少的代码,更多的魔力。
在不利的一面...
约定超过配置使抽象变得如此繁重,以至于您几乎不知道它是如何工作的。有时似乎很神奇,这又带来了另一个缺点。一旦开始工作,许多开发人员就不在乎它如何工作。
对于那些使用DI容器学习DI的人来说,这是一个障碍。他们没有完全理解容器抽象的设计模式,良好实践和原则的相关性。我问开发人员是否熟悉DI及其优势,他们回答:- 是的,我使用过Spring IoC-。(这是什么意思?!?)
人们可以同意还是不同意这些“缺点”。以我的拙见,必须知道您的项目中正在发生什么。否则,我们对此将不完全了解。还要了解DI的用途,并具有如何实现DI的概念。
从积极的一面...
一句话生产力。框架让我们专注于真正重要的事情。应用程序的业务。
尽管存在很多缺点,但对于我们中的许多人(该工作取决于截止日期和成本),这些工具是宝贵的资源。我认为,这应该是我们支持实现DI容器的主要论据。生产力。
测试中
无论是实现纯DI还是容器,测试都不会成为问题。恰恰相反。相同的容器通常为我们提供开箱即用的单元测试模拟。这些年来,我一直将测试用作温度计。他们告诉我我是否严重依赖集装箱设施。我之所以这样说,是因为这些容器可以初始化私有属性,而无需使用setter或构造函数。他们几乎可以在任何地方注入组件!
听起来很诱人吗?小心!不要掉进陷阱!
意见建议
如果您决定实施容器,我强烈建议您坚持良好做法。继续实现构造函数,setter和接口。强制框架/容器使用它们。这将使迁移到另一个框架或删除实际框架变得更加容易。它可以大大减少对容器的依赖。
关于这种做法:
何时使用DI容器
我的回答将因自己的经验而有偏差,主要是支持DI容器(正如我所评论的那样,我非常专注于生产力,因此我从不需要纯DI。相反)。
我认为您会发现Mark Seeman的有趣文章,也回答了有关如何实现纯DI的问题。
最后,如果我们谈论Java,那么我将首先考虑一下JSR330-Dependency Injection。
总结
好处:
- 削减成本和节省时间。生产率。
- 组件数量更少。
- 代码变得更加简单和简洁。
缺点:
- DI被委托给第三方库。我们应该意识到它们的取舍,优势和劣势。
- 学习曲线。
- 他们很快会让您忘记一些良好的习惯。
- 增加项目的依赖关系(更多库)
- 基于反射的容器需要更多的资源(内存)。如果我们受到资源的限制,这很重要。
与纯DI的区别: