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

相关文章

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、