学习NestJs你必须了解IOC(反转控制)

哈喽哈喽,大家好。我是你们的金樽清酒。今天是回家学习的第三天。说实话,感觉现在看的全是理论,没有经历什么实战,所以老是感觉心里没底。遂写篇文章总结一下吧,来检验一下自己的学习成果。

什么是IOC(Inverse of Control)

ioc也叫反转控制。为什么叫反转控制呢?我们举个例子来理解一下。在后端系统中有很多的功能,如controller模块。service模块。数据库模块。要使用这样我们要创建很多实例,并且它们可能各自依赖,有很强的依赖关系,十分的复杂。那我们要使用它们还得一个个去实例化然后组织它们的执行顺序十分的麻烦。基于这个问题,nest中用到了ioc反转控制来解决这个问题。

我们想一下。如果可以的话,能不能有一个东西帮我们自动的实例化对象并且自动的组织执行顺序。比如我们写好依赖关系,然后它扫描到依赖关系就能自动的创建实例并且按规定的顺序执行。有,它就是ioc反转控制。它提供一个容器将扫描到的依赖自动创建然后自动组装调用。

如何使用ioc

在nest中有@Controller和@Injectable两种装饰器表示该calss可以被放到ioc容器当中。那么这两个装饰器有什么区别呢?@Controller只能被注入,而@Injectable装饰的既可以注入也可以被注入。让我们创建一个项目看一下。

用nest cli命令

arduino 复制代码
nest new ioc_test

创建一个名为ioc_test的nest项目。

创建完之后src下有几个文件。main.ts是入口文件。controller是解析参数控制路由的。module是管理模块之间的依赖的,service是处理业务逻辑的地方,比如返回数据操作数据库。这几个文件之间是啥关系呢。controller解析参数之后拿到service里面的方法使用。module就是管理各模块之间的依赖关系,谁是controller谁是provider。谁是生产者谁是消费者是吧。

首先看到sercice文件

用@Injectable装饰说明该类可以被放到ioc容器当中自动创建。然后它里面有一个getHello方法,返回hellow world。

再看到controller文件

用@Controller装饰可以被放入ioc容器。里面可以写参数控制路由。中间构造器注入AppSrvice。这个provider的注入我们后面单独一篇文章讲。你看这就是@Controller和@Injectable的区别。一个只能被注入。后者可以注入也可以被注入。

再看module为文件

我们用装饰器修饰为可注入ioc容器后,需要在module里面声明,哪些是controller,哪些是provider,还有imports和exports将实例跑出引入的参数。

声明注册完之后,nest会读取这个文件,然后自动创建对象并组装,实现反转控制。

我们运行一下看一下效果。

nest run start运行之后,程序已经运行在3000端口。我们用浏览器访问一下localhost://3000

可以看到成功的返回在controller里面使用的service返回的内容。这就是反转控制。

总结

在后端中有很多的功能。如果一个手动的创建对象并使用会非常的复杂。所以在nest中有IOC机制。自动的根据依赖关系自动创建对象并且组装。它的实现原理是创建一个IOC容器,在被@Controller和@Injctable装饰的class说明可以被放进IOC容器,然后在ioc容器中根据依赖实例化并且组装。

相关推荐
恋猫de小郭2 分钟前
Flutter Riverpod 3.0 发布,大规模重构下的全新状态管理框架
android·前端·flutter
wordbaby4 分钟前
用 window.matchMedia 实现高级响应式开发:API 全面解析与实战技巧
前端·javascript
晚星star15 分钟前
在 Web 前端实现流式 TTS 播放
前端·vue.js
huabuyu15 分钟前
基于 Taro 的 Markdown AST 渲染器实现
前端
薄雾晚晴15 分钟前
Rspack 性能优化实战:JS/CSS 压缩 + 代码分割,让产物体积直降 40%
前端·javascript
本末倒置18316 分钟前
前端面试高频题:18个经典技术难点深度解析与解决方案
前端·vue.js·面试
狗头大军之江苏分军37 分钟前
Meta万人裁员亲历者自述:小扎尝到了降本的甜头
前端·后端·github
秃顶老男孩.41 分钟前
web中的循环遍历
开发语言·前端·javascript
龙在天1 小时前
vue 请求接口快慢 覆盖 解决方案
前端
跟橙姐学代码1 小时前
Python 类的正确打开方式:从新手到进阶的第一步
前端·python·ipython