4 nesjs IOC控制反转 DI依赖注入

2024-08-24 04:20

本文主要是介绍4 nesjs IOC控制反转 DI依赖注入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
在 NestJS 中,IOC(控制反转)和 DI(依赖注入)是核心概念,它们使得应用程序的模块化和解耦变得更加容易。

控制反转(IOC,Inversion of Control)

控制反转是一个设计原则,它的基本思想是将控制逻辑从应用程序代码中抽离出来,让框架或容器来负责控制逻辑的管理。在传统的编程模型中,应用程序代码负责创建和管理依赖关系。而在控制反转的模型中,框架负责这些操作,从而将控制的“责任”反转给了框架。

依赖注入(DI,Dependency Injection)

依赖注入是实现控制反转的一种常见方式。在 NestJS 中,依赖注入指的是将一个对象的依赖关系(即该对象所依赖的其他对象)注入到对象中,而不是由对象自己创建这些依赖。

在 NestJS 中,DI 的工作流程如下:

  1. 定义服务:首先,你定义一个服务(比如 UserService),这个服务可能依赖于其他服务(比如 LoggerService)。

  2. 提供者:在 NestJS 中,服务通常是作为提供者(provider)进行注册的。提供者可以是服务、工厂函数、值等。

  3. 注入依赖:使用 @Injectable() 装饰器标记的类可以被 NestJS 的依赖注入系统管理。在构造函数中,使用 constructor(private readonly logger: LoggerService) 语法来注入依赖。NestJS 在运行时会自动实例化这些依赖,并将它们注入到服务中。

  4. 模块化:所有的提供者和服务在 NestJS 中都是模块的一部分,模块会定义哪些提供者是可用的,并且可以指定哪些模块和提供者是外部可用的。

例子

未使用控制反转和依赖注入

// 外套 类
class Overcoat {name: stringconstructor(name: string) {this.name = name}
}class People {override: Overcoatconstructor() {this.override = new Overcoat('巴黎世家')}showMyOverride() {console.log(this.override.name)}
}const person = new People()person.showMyOverride() // 输出 "巴黎世家"

潜在坏处:

  1. 违反了单一职责原则:People 类负责了它的核心职责(比如表示一个人)之外的其他职责,例如创建 Overcoat 的实例。这会导致类的职责不清晰,可能会导致代码难以维护和扩展。

  2. 系统的低内聚性和高耦合:硬编码的依赖关系导致 People 类和 Overcoat 类之间的耦合性较高。这意味着如果 Overcoat 类的实现需要改变,或者Overcoat 类需要不同的实现,那么 People 类也需要相应地做出修改。

  3. 测试难度增加:直接创建依赖的实例使得单元测试变得复杂。当测试 People 类时,需要保证 Overcoat 类的实现按照预期工作。如果想用不同的 Overcoat 实例测试 People 类,就需要修改 People 类的代码,这违背了测试驱动开发的宗旨。

使用控制反转和依赖注入

// 外套 类
class Overcoat {name: stringconstructor(name: string) {this.name = name}
}// 人物 类
class People {override: Overcoatconstructor(override: Overcoat) {this.override = override}showMyOverride() {console.log(this.override.name)}
}// 中间件用于解耦
class Container {modules: anyconstructor() {this.modules = {}}provide(key: string, module: any) {this.modules[key] = module}get(key: string) {return this.modules[key]}
}// 设置容器和依赖(组装过程)
const container = new Container()
container.provide('巴黎世家', new Overcoat('巴黎世家'))
container.provide('海澜之家', new Overcoat('海澜之家'))// 使用依赖注入创建 People 实例
const overcoat = container.get('巴黎世家') as Overcoat
const people = new People(overcoat)// 展示结果
people.showMyOverride()

这篇关于4 nesjs IOC控制反转 DI依赖注入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101437

相关文章

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Maven如何手动安装依赖到本地仓库

《Maven如何手动安装依赖到本地仓库》:本文主要介绍Maven如何手动安装依赖到本地仓库问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载依赖二、安装 JAR 文件到本地仓库三、验证安装四、在项目中使用该依赖1、注意事项2、额外提示总结一、下载依赖登

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制