DI 、 IOC 和 DIP 的理解

499 阅读2分钟

DIP

依赖反转原则(Dependency inversion principle,DIP),是一种特定的解耦形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。———— 维基百科

  1. 高层次的模块不应该依赖与低层次的模块,两者都应该依赖于抽象接口。
  2. 抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。

IOC

控制反转(Inversion of Control,IoC),通过控制反转,对象在被创建的时候,有一个控制系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。可以说,依赖被注入到对象中。———— 维基百科

这些话的意思就是将依赖对象的创建和绑定转移到被依赖对象类的外部来实现。实现控制反转最常见的方式是依赖注入,还有一种方式依赖查找

DI

依赖注入(Dependency Injection,DI),在软件工程中,依赖注入是种实现控制反转用于解决依赖性设计模式。一个依赖关系指的是可被利用的一种对象(即服务提供端)。依赖注入是将所依赖的传递给将使用的从属对象(即客户端)。该服务将会变成客户端的状态的一部分。传递服务给客户端,而非允许客户端来建立或寻找服务,是本设计模式的基本要求。

DI 是 IOC 的实现方式之一。

IoC container

IoC container 的作用是为了在复杂程序中通过容器来集中处理依赖关系,它可以理解为 DI 的辅助手段,为了解决在 js 中没有抽象类和接口、以及在最新的 ts 版本中,抽象类和接口在运行时不支持的问题。

InversifyJS

一个强大且轻量级的基于typescript的 IoC container, 能够很好地服务于 JavaScript 和 nodejs 应用

官方文档:

inversify.io/

mama-syringe

基于 InversifyJS 的一个简单封装,在 XFlow 源码中大量使用。

官方文档:

www.npmjs.com/package/man…

参考文档

英文博客,比较详细地介绍了以上几个概念,代码 demo 写的也很好。

viktor-kukurba.medium.com/dependency-…

知乎上的,感觉质量稍差一些,代码 demo 不是很好理解,不过是中文写的,比起

zhuanlan.zhihu.com/p/61018434