依赖注入的概念在许多框架中都有使用,比如后端的Spring
、前端的Angular
等,笔者内部的项目也用到了这个概念,本文尝试总结一下依赖注入的概念和实现。
- 依赖反转
- 控制反转
- 依赖注入
解除高阶模块与低阶模块的耦合关系,使高阶模块不再依赖于低阶模块:
-
高阶模块不应当依赖于低阶模块,两者都应当依赖于抽象
-
抽象不应当依赖具体的实现方式
-
实现方式应当依赖于抽象
反转获得依赖对象的控制流程, 说人话就是不再由被依赖的模块自己创建依赖对象,而是由外部模块创建依赖对象并传递给被依赖的模块。
注意不要混淆依赖注入和依赖反转的概念,依赖注入是一种设计模式,而依赖反转是一种设计原则,依赖注入是依赖反转的一种实现方式。
比如在angularJS中,因为使用的 JS,其中并没有对应的接口的概念,所以也就没有对应遵循高层模块和底层模块都依赖于抽象的原则,所以在angularJS中,依赖注入的方式是通过字符串的方式来实现的
- injection-js: 一个Angular生态系统中常用的依赖注入框架
- InversifyJS: 一个轻量级的依赖注入框架,可以用于任何JavaScript应用程序
可以参考这里
官方文档: inversifyJS 官方文档: InversifyReact
注意事项:
- 生命周期的问题: 如果只是在某个大组件中使用了依赖注入,那么在这个组件销毁的时候,需要手动调用
container.unbindAll()
来解绑所有的依赖,否则会造成内存泄漏