Skip to content

Latest commit

 

History

History
executable file
·
74 lines (38 loc) · 2.83 KB

控制反转与依赖注入.md

File metadata and controls

executable file
·
74 lines (38 loc) · 2.83 KB

前言

依赖注入的概念在许多框架中都有使用,比如后端的Spring、前端的Angular等,笔者内部的项目也用到了这个概念,本文尝试总结一下依赖注入的概念和实现。

  • 依赖反转
  • 控制反转
  • 依赖注入

困境

困境一、 高层模块依赖底层模块的具体实现

困境二、 被依赖的模块需要手动创建

设计原则

依赖反转(Dependency-Inversion Principle-DIP)

解除高阶模块与低阶模块的耦合关系,使高阶模块不再依赖于低阶模块:

  • 高阶模块不应当依赖于低阶模块,两者都应当依赖于抽象

  • 抽象不应当依赖具体的实现方式

  • 实现方式应当依赖于抽象

设计原则二、控制反转(Inversion of Control-IoC)

反转获得依赖对象的控制流程, 说人话就是不再由被依赖的模块自己创建依赖对象,而是由外部模块创建依赖对象并传递给被依赖的模块。

设计模式、依赖注入(Dependency Injection-DI)

注意不要混淆依赖注入和依赖反转的概念,依赖注入是一种设计模式,而依赖反转是一种设计原则,依赖注入是依赖反转的一种实现方式。

比如在angularJS中,因为使用的 JS,其中并没有对应的接口的概念,所以也就没有对应遵循高层模块和底层模块都依赖于抽象的原则,所以在angularJS中,依赖注入的方式是通过字符串的方式来实现的

前端依赖注入的框架

  • injection-js: 一个Angular生态系统中常用的依赖注入框架
  • InversifyJS: 一个轻量级的依赖注入框架,可以用于任何JavaScript应用程序

AngularJS中自带的依赖注入

可以参考这里

InversifyJS && Inversify-react

官方文档: inversifyJS 官方文档: InversifyReact

注意事项:

  • 生命周期的问题: 如果只是在某个大组件中使用了依赖注入,那么在这个组件销毁的时候,需要手动调用container.unbindAll()来解绑所有的依赖,否则会造成内存泄漏

参考