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

相关推荐
天渺工作室3 小时前
实现一个adblock/adblock plus等浏览器广告拦截器检测插件
前端·javascript
阳光是sunny4 小时前
Vue 项目怎么做用户行为全链路监控?轻量插件方案详解
前端·面试·架构
ZhengEnCi4 小时前
Q04-Vite禁用CSS代码分割-解决生产环境样式加载顺序混乱问题
前端·vue.js·vite
九酒4 小时前
AI Agent 开发踩坑记:口播功能非得用 APP 原生实现吗?
前端·人工智能·agent
Jackson__5 小时前
做了一段时间的AI coding后,我终于搞清了 CLI 和 MCP 的区别
前端·agent·ai编程
IT_陈寒7 小时前
JavaScript项目实战经验分享
前端·人工智能·后端
用户47949283569158 小时前
6w star,GitHub 趋势第一的 Ponytail,这个agent插件到底在火什么
前端·后端
薛定喵的谔9 小时前
我开源了一个精致的 Next.js 博客模板:Skyplume
前端·前端框架·next.js
张龙68710 小时前
构建生产级 AI Agent:工具调用与记忆架构实战指南
前端
kyriewen11 小时前
2026 年了,还在用 Node.js?Bun 迁移实战:20 分钟搞定,附踩坑记录
前端·javascript·node.js