学习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容器中根据依赖实例化并且组装。

相关推荐
网络点点滴19 分钟前
组件通信-作用域插槽
前端·javascript·vue.js
kyriewen111 小时前
异步编程:从“回调地狱”到“async/await”的救赎之路
开发语言·前端·javascript·chrome·typescript·ecmascript·html5
Old Uncle Tom1 小时前
Markdown Viewer 再升级
前端
Luna-player1 小时前
Vue3中使用vue-awesome-swiper
前端·vue.js·arcgis
SuperEugene1 小时前
Vue3 Pinia 状态管理规范:状态拆分、Actions 写法、持久化实战,避坑状态污染|状态管理与路由规范篇
前端·javascript·vue.js·前端框架·pinia
black方块cxy1 小时前
实现一个输入框多个ip以逗号分隔最多20组,且ip不能重复
java·服务器·前端
@PHARAOH2 小时前
WHAT - AI 时代下的候选人
大数据·前端·人工智能
竹林8182 小时前
从零到一:我在Solana NFT铸造前端中搞定@solana/web3.js连接与交易
前端·javascript
猪八宅百炼成仙2 小时前
不用点击也能预览图片:Element UI ImageViewer 命令式调用方案
前端
尘世中一位迷途小书童2 小时前
前端工程化基石:package.json 40+ 字段逐一拆解
前端·javascript·架构