首页 > 其他分享 >Nestjs 依赖注入和控制反转

Nestjs 依赖注入和控制反转

时间:2023-12-15 13:32:32浏览次数:29  
标签:容器 依赖 DI 反转 ts Nestjs 注入


前言

Nest.js 是一个使用 TypeScript 实现的在 Node.js 环境中运行的 Web 服务开发框架。它借鉴了很多优秀的设计思想,本文来说一说 Nest 中的依赖注入和控制反转。

依赖注入

依赖注入,英文名是 Dependency Injection,简称 DI

什么是依赖注入?可以分开来看,就是“依赖”和“注入”。

您可能想了,你这是在玩组词造句吗?

也是,也不是。有时候将一个概念名词进行拆解,在一定程度上是能够方便理解的。

Nest 采用面向对象编程,而不像经典的 Express 和 Koa 一样,是函数式风格编程。站在面向对象的角度,所谓“依赖”,其实就是写代码时用到的一个一个的类的实例。

假设这里有 3 个类,分别是 A,B,C,但是它们之间会互相引用,产生依赖关系,比如:

// A.ts
import B from 'B.ts'

class A {
    constructor() {
        this.b = new B()
    }
}

// B.ts
import C from 'C.ts'

class B {
    constructor() {
        this.c = new C()
    }
}

// C.ts
import A from 'A.ts'

class C {
    constructor() {
        this.a = new A()
    }
}

上面示例代码中,实例 b 就是 A 类的依赖,实例 c 就是 B 类的依赖,实例 a 就是 C 类的依赖。

当有几十个类、上百个类时,如果人工维护这种依赖关系,将会非常复杂和繁琐。

为了解决这个问题,可以采用一种叫做控制反转的设计原则。

控制反转

控制反转也就是 IoC,英文名唤作 Inversion of Control

同样对它进行拆解,就是“控制” 和 “反转”。

还是以上面的代码为例,在 A 类中要用到依赖项 b,所以我们自己在构造方法中实例化了 B类。这个过程,就是控制。我们自己控制了B类的引入,以及实例 b的创建。这也是我们平时开发中最正常,最普通的一种方式。

原本由我们自己控制的流程,交给“其他人”去负责,也就是将控制权进行了转移,这个就叫做“反转”。

那控制权转移给谁了呢?现在你面前只有两样东西:一个是你自己,一个是电脑里的代码,更准确的说,是你正在使用的框架 Nest.js。控制权不在你这里了,那么自然只能跑到框架中去了,总不至于会跑到隔壁同事身上去。

啰嗦了这么一大堆,其实就是一句话:

把原本我该负责的工作(创建依赖),交给框架自己去负责(它需要哪个依赖,就自己去引入),这就是控制反转 IoC。

这时候您又说了:

诶,不对啊,你只说了“依赖”、“控制”和“反转”,还有“注入”没说呢?

其实上面那句话,已经包含了“注入”的过程。控制反转的时候,依赖由框架负责引入,注入到需要它的地方,就是注入。

DI 容器

按照上面所讲述的过程:创建和维护依赖很繁琐,于是交给框架去做。

框架中的具体“负责人”叫做 DI 容器,即依赖注入容器,它具体负责了哪些事情呢:当应用启动时,DI 容器会把依赖都扫描出来,注册到容器中,等代码中哪个地方用到某个依赖时,由容器负责提供使用。

DI 容器有时候也叫 IoC 容器,叫什么不重要,属于个人理解的区别,只要清楚

总结

本文中的描述比较直白,缺乏一定的严谨性,主要是为了方便大家从作用的角度去理解 DI 和 IoC 。

那就再总结一次:

  • DI:应用需要的依赖,由框架负责管理,注入到需要它的地方
  • IoC:创建和维护依赖的工作由开发者转交给框架

如果有什么错误表述,概念上的误解,欢迎在评论区留下宝贵的意见,感谢阅读

标签:容器,依赖,DI,反转,ts,Nestjs,注入
From: https://blog.51cto.com/u_12382805/8840110

相关文章

  • 未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义
    原文链接:https://blog.csdn.net/weixin_45488182/article/details/132537085网上的资料,大都是因为版本号不一致,我检查了很多遍,我这边版本号是12.0.1与12.0.2,config里是12.0.0,应该算是一致的吧。并且清理重新生成后,就不会报这个错。程序可以正常运行了。今天终于解决了这个问题,......
  • 2023-12-14 npm和yarn无法拉取依赖,cnpm可以 ==》切换镜像源
    这两天遇到个问题,是关于依赖无法拉取的问题,尽管我有三分猜到了是什么原因,但我还是不肯往那个方向思考,哎,真是死牛一便颈。如,我要给前端项目装个express框架,用npm装,装了大半天一点反应都没有,用yarn装就直接报网络无法连接,如图: 用cnpm装就没问题,秒过。注意:我的电脑是能正常上网......
  • 【机器学习】算法作用与依赖库合集
    算法与库1.决策树:-库: fromsklearn.treeimportDecisionTreeClassifier(分类树) fromsklearn.treeimportDecisionTreeRegressor(回归树)-计算场景:分类和回归问题2.逻辑回归:-库: fromsklearn.linear_modelimportLogisticRegression-......
  • 【回文链表】快慢指针+反转链表
    leetcode234.回文链表题意:判断一个链表是不是回文(中心对称)的【反转链表】题解1:得到原链表的反转链表,然后对比原链表与反转链表的内容是否一致即可。反转链表版本代码/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNo......
  • 使用yarn安装依赖包出现“There appears to be trouble with your network connection
    我们在使用yarn安装依赖包文件的时候,可能会出现“Thereappearstobetroublewithyournetworkconnection.Retrying...”超时的提醒,很有可能是因为yarn默认的镜像地址为国外,因此慢(超时)就说得过去了……1、......
  • vue项目 npm install 安装依赖 特别慢 解决办法
    vue项目npminstall安装依赖特别慢解决办法使用NPM(Node.js包管理工具)安装依赖时速度特别慢,为了安装Express,执行命令后两个多小时都没安装成功,最后只能取消安装,笔者20M带宽,应该不是我网络的原因,后来在网上找了好久才找到一种最佳解决办法,在安装时可以手动指定从哪个镜像服务器......
  • 【反转链表】while循环/递归
    leetcode206.反转链表题意:给定链表表头,反转链表,返回反转链表的表头【循环】题解:head维护原链表当前节点,nHead维护反转链表的头节点,nHead置于head前一位,依次后移,直至head到链表尾结束。双指针循环版本/***Definitionforsingly-linkedlist.*publicclassListNode......
  • spring 怎么解决循环依赖的
    spring怎么解决循环依赖的理解spring的生命周期分为容器启动阶段、bean的实例化阶段、bean的属性注入阶段、bean的初始化阶段、bean的缓存阶段、bean的销毁阶段怎么解决循环依赖假设有两个对象X和Y,X依赖了Y,Y依赖了X,spring能解决循环依赖,底层主要接住了3个map。第一个是sing......
  • .NET 依赖注入的3中方式
    一、简介    依赖注入共有3种方式:构造函数注入、属性注入、方法注入二、构造函数注入    在program.cs中对组件进行注册:   builder.Services.AddScoped<IScopedService,ScopedService>();    服务注册配置后,在需要注入的类上使用构造函数。pu......
  • 使用 npm-check-updates 检查项目的 npm 依赖项是否有更新
    一、安装npm-check-updates:npminstall-gnpm-check-updates二、使用:在项目根目录运行以下命令,检查所有项目依赖项的最新版本:ncu执行结果如下:红色=主要升级青色=小幅升级绿色=补丁升级更新版本:ncu-u注意备份或者提交代码,确保包文件处于版本控制......