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

相关文章

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

使用maven依赖详解

《使用maven依赖详解》本文主要介绍了Maven的基础知识,包括Maven的简介、仓库类型、常用命令、场景举例、指令总结、依赖范围、settings.xml说明等,同时,还详细讲解了Maven依赖的... 目录1. maven基础1.1 简介1.2 仓库类型1.3 常用命令1.4 场景举例1.5 指令总结

Spring IOC的三种实现方式详解

《SpringIOC的三种实现方式详解》:本文主要介绍SpringIOC的三种实现方式,在Spring框架中,IOC通过依赖注入来实现,而依赖注入主要有三种实现方式,构造器注入、Setter注入... 目录1. 构造器注入(Cons编程tructor Injection)2. Setter注入(Setter

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

python中poetry安装依赖

《python中poetry安装依赖》本文主要介绍了Poetry工具及其在Python项目中的安装和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前言1. 为什么pip install poetry 会造成依赖冲突1.1 全局环境依赖混淆:1

Python实现局域网远程控制电脑

《Python实现局域网远程控制电脑》这篇文章主要为大家详细介绍了如何利用Python编写一个工具,可以实现远程控制局域网电脑关机,重启,注销等功能,感兴趣的小伙伴可以参考一下... 目录1.简介2. 运行效果3. 1.0版本相关源码服务端server.py客户端client.py4. 2.0版本相关源码1

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去