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

news2024/9/28 1:19:15

在这里插入图片描述
在 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: string
  constructor(name: string) {
    this.name = name
  }
}

class People {
  override: Overcoat

  constructor() {
    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: string
  constructor(name: string) {
    this.name = name
  }
}

// 人物 类
class People {
  override: Overcoat

  constructor(override: Overcoat) {
    this.override = override
  }

  showMyOverride() {
    console.log(this.override.name)
  }
}

// 中间件用于解耦
class Container {
  modules: any

  constructor() {
    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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

clickhouse中使用ReplicatedMergeTree表引擎数据去重问题

问题:使用ReplicatedMergeTree表引擎,该引擎逻辑上是不会对于主键相同的数据,进行去重合并操作。如果想要去重,可以使用ReplacingReplicatedMergeTree表引擎。然后使用ReplicatedMergeTree表引擎进行数据insert 插入数据&#xff…

数据防泄密之源代码防泄密的七大要则!

在数字化时代,源代码的安全保护对企业至关重要。它是企业创新和竞争力的核心,一旦泄露,可能会带来不可估量的损失。因此,选择一款合适的源代码加密软件成为了企业信息安全的关键。SDC沙盒防泄密软件以其独特的技术优势和全面的功能…

Windows 11 时间显示 到秒

效果 第一步 win R --> regedit 打开注册表 第二步 打开该路径HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced 第三步 然后新建一个DWORD(32位)值。 第四步 文件命名为ShowSecondsInSystemClock,双…

Flask+LayUI开发手记(二):LayUI弹出层表单的校验

LayUI里面layer.open()弹出层是一个十分常用也十分强大的功能,比如我们经常是先把记录以数据表单datatable方式显示出来,然后增删改查的功能就利用layer.open调取另一个form表单页面来进行数据编辑并提交数据完成数据表的更新操作。 同样,Lay…

【Dash】feffery_antd_components 简单入门示例

一、简单了解 feffery_antd_components 简称 fac ,是一个基于 Ant Design 的 Dash 第三方组件,由Feffery 老师开源维护的 Python 网页开发组件库,它具有丰富的页面常用交互组件功能,使开发者可以使用纯Python的方式快速构建现代…

【工作记录】springboot中基于redis实现地理位置相关需求@20240822

背景 近期收到一个需求,有个事件管理系统,存储了用户上报上来的事件信息,其中包含了事件发生的经纬度,还有另外一个系统中保存了一系列的摄像头数据,也包含经纬度信息。 需求是这样的,用户点击某个事件的…

OpenSBI的PMP

概述 在RISC-V体系架构中,PMP是用于保护物理内存访问权限的机制。PMP机制允许为不同的物理内存区域指定访问权限(读、写、执行)。这种机制使得运行在RISC-V处理器上的软件只能访问被明确授权的物理地址空间,从而提高了系统的安全…

5.登录功能的开发

登录功能的开发 一、前端1.1首页跳转到登录页面1.2登录界面处理 二、后端2.1创建User实体类2.2创建UserDto类2.3创建UserServlet类 三、效果演示四、轻提示组件 一、前端 1.1首页跳转到登录页面 登录页面是一个单独的页面,我们需要从项目的首页跳转到登录页面。具…

OpenAI Whisper Cannot Import Numpy

题意:“OpenAI Whisper 无法导入 Numpy” 问题背景: I am trying to run the OpenAI Whisper model but running into the following error when trying to run my script: “我正在尝试运行 OpenAI Whisper 模型,但在运行脚本时遇到了以下…

【全网行为管理解决方案】上网行为系统有哪些?

全网行为管理系统是一种用于监控、管理和优化企业内部网络中所有用户活动及网络流量的技术解决方案。 这类系统可以帮助企业提高网络安全、优化网络性能,并确保网络使用符合公司政策及法规要求。以下是几种常用的上网行为管理系统: 一、安企神 特点&am…

防范小程序隐私合规风险,筑牢用户信任防线

随着国内APP软件生态的成熟,依托于头部APP的小程序逐渐成为零售、娱乐、出行等行业必选的获客渠道之一。较低的开发成本和成熟的用户营销功能,令小程序的数量在过去几年呈指数级增长。截止2023年,头部APP内集成的小程序总量已超千万。然而&am…

【业余玩儿AI】【文档问答】实操记录0822

电梯 前文回顾继续踩坑实录从头来过,docker部署Ollama我一定是被偷听了,大数据之神把我拉出泥潭时间回到白天,模型初窥时间回到开心的链接上Ollama那一刻 按捺住乱撞的小鹿,我去准备下文的剧情了 前文回顾 这里书接上文,上文说到: 目标是文档问答,先是本地部署了Marker,然后又…

计算机二级题--指针 章节

1.概念 1.函数名代表函数的入口地址 2.交换地址 1.*s,说明s是一个指针变量 2.s&k;说明让s指向k地址 3.所以*sk实际上与上面那句是等价的,因此m一直都没有什么变化依然是3 4.k是全局变量所以是5 3,7;改变s指向之后,又将值赋给了s指向的…

WS2812B硬件电路设计总结

一、WS2812b的电压是多少? WS2812B的电压通常在3.5到5.3V之间。 WS2812B是一种流行的可编程LED,也称为NeoPixel。它集成了RGB LED和控制电路,可以通过单个数据线进行串联连接。这种LED的输入电源电压范围为3.5到5.3V,这意味着它…

WPF中的XAML是如何转换成对象的?

起因 最近有遇到有小伙伴在实现TreeView不同层级使用不同数据模板时,遇到了一些问题。 经过查阅资料,我提供了两种解决方案。 第一种是使用TemplateSelector,这种方式可以根据ViewModel设置不同的数据模板。 第二种是根据数据动态创建数据…

中兴 随身WIFI 5产品参数

产品参数 无线参数无线速率2.4GHz, 300Mbps天线类型内置Wi-Fi天线软件功能手机App中兴ZTE Link APP Pro更多功能移动网络(4G/3G)接入、Wi-Fi接入、Wi-Fi加密认证、WebUI、PIN保护、FOTA升级等硬件规格接口Micro USB/标准SIM卡(2FF&#xff0…

软件测试 缺陷报告处理流程

系统软件 操作系统 软件缺陷 缺陷报告 当测试人员发现了一个缺陷,需要填写一份 缺陷报告 来记录这个缺陷,并通过这个缺陷报告告知开发人员所发生的问题————缺陷报告是测试人员和开发人员交流沟通的重要工具。 缺陷报告的组成 1、缺陷ID 缺陷编号&…

JuiceFS 在多云架构中加速大模型推理

在大模型的开发与应用中,数据预处理、模型开发、训练和推理构成四个关键环节。本文将重点探讨推理环节。在之前的博客中,社区用户 BentoML 和贝壳的案例提到了使用 JuiceFS 社区版来提高模型加载的效率。本文将结合我们的实际经验,详细介绍企…

Linux——网络(2)

一、通信 --- 不同主机上进程间的通信 1、IP和端口号 IP:标识网络中的一台主机 本质上 32位的整型数据 端口号: 标识某个进程 本质上 16位的整型数据 2、udp和tcp udp的特点: 1.无连接 2.不可靠 tcp的特点: 1.面…

【赵渝强老师】执行Oracle的冷备份与冷恢复

冷备份与冷恢复是指发生在数据库已经正常关闭的情况下进行的备份和恢复。由于此时数据库已经关闭,通过冷备份可以将数据库的关键性文件拷贝到另外存储位置。冷备份因为只是拷贝文件,因此备份的速度非常快。在执行恢复时,只需将文件再拷贝回去…