IoC: Inversion of Control
DIP: Dependency Inversion Principle (SOLID当中的D)
DI: Dependency Injection
每当看到这些词,总觉得它们是差不多的。但它们之间应该还是有些细微的差别的。
以下只是根据自己的理解,如果哪里错了,还望指正。
IoC:
- 每当我们提到IoC,一般就是指IoC Container。例如Autofac。虽然这样的理解有点狭隘。
- IoC是一种指导思想,关于控制反转的指导思想。一般思想之类的都是站在很高的高度。现在的图形界面程序就是IoC的一种体现。以前计算机执行程序一路到底,但现在控制流程完全被用户操作反转了。
- 当我们使用IoC Container的时候,一定要刻意的把class分成Newable和Injectable。IoC Container可以很容易的提供Injectable的class实例,但不太容易提供Newable的class实例。例如,一个class的构造函数需要一个string类型,IoC Container并不知道提供什么样的string。关于这点,我们还会进一步讨论讨论。
DIP:
- Bob大叔总结的SOLID当中的依赖倒置原则。Bob在讲解这个原则是用了一个copy小程序的示例。我们先把上层需要什么的依赖进行抽象,然后底层在去实现这样的抽象。并不是先实现底层的功能,然后上层再使用底层提供的功能。这是一种思考问题方式的转变。
- DIP是一种原则,没有很具体的技术可以直接搬用。
DI:
- Dependency Injection包含的内容也可以很宽 (可以参考这本书Dependency Injection in .NET)
- DI提供了一些具体的技术来帮助我们编写松耦合(Loosely Coupled)代码。但最常用的还是构造函数注入。
IoC包含的范围应该大于DIP,DIP包含的范围应该大于DI。
我们确实需要好好考虑怎样管理Dependency,因为我们写代码每时每刻都要遇到。
如果理解了DI,确实会提高我们的代码质量,也增加了可读性、可维护性、可扩展性和可测试性。