NestJS中实现注入多个实现了同一个接口的Service
在NestJS中有一种场景,在注入的时候需要将多个实现了同一个接口的service都注入到系统里,而NestJS中默认时没有这种注入,此时我们可以使用一个变通的provider来实现这一功能。
看下面例子,假定我们有一个OSService接口,其中定义了一个方法返回OSUser数组,假定我们有多个实现类,比如这里的LinuxOSService和WindowsOSService,我们希望将这两个实现类都注入到系统中,那么我们可以这样实现:
osuser.ts
定义一下基本的OSUser对象和OSUserType枚举。
export interface OSUser {name: string;type: OSUserType;
}export enum OSUserType {LINUX = 'LINUX',WINDOWS = 'WINDOS',
}
osuser.service.ts
定义OSUserService接口和两个实现类LinuxOSUserService和WindowsOSUserService。
import { Injectable } from '@nestjs/common';
import { OSUser, OSUserType } from './osuser';export interface OSUserService {getUsers(): OSUser[];
}@Injectable()
export class LinuxOSUserService implements OSUserService {users: OSUser[] = [];getUsers(): OSUser[] {this.users = [{ name: 'John', type: OSUserType.LINUX },{ name: 'Jane', type: OSUserType.LINUX },{ name: 'Bob', type: OSUserType.LINUX },];return this.users;}
}@Injectable()
export class WindowsOSUserService implements OSUserService {users: OSUser[] = [];getUsers(): OSUser[] {this.users = [{ name: 'John', type: OSUserType.WINDOWS },{ name: 'Jane', type: OSUserType.WINDOWS },{ name: 'Bob', type: OSUserType.WINDOWS },];return this.users;}
}
osuser.controller.ts
控制器注入了OSUserServices,这是一个数组,包含了所有的OSUserService实现类,然后在list方法中遍历这个数组,获取所有的OSUser对象,最后返回。
import { Controller, Get, Param, Inject } from '@nestjs/common';
import { OSUserService } from './osuser.service';
import { OSUser, OSUserType } from './osuser';@Controller('osuser')
export class OSUserController {constructor(@Inject('OSUserServices') private osUserServices: OSUserService[],) {}@Get()list() {const osUsers: OSUser[] = [];this.osUserServices.map((osUserService) => {osUserService.getUsers().map((osUser) => osUsers.push(osUser));});return osUsers;}
}
osuser.module.ts
模块的providers中定义了两个OSUserService的实现类,并且定义了一个新的provider,这个provider的名字是’OSUserServices’,它的值是一个工厂函数,这个工厂函数接收两个参数,分别是LinuxOSUserService和WindowsOSUserService,然后返回一个数组,这个数组包含了所有的OSUserService实现类。
import { Module } from '@nestjs/common';
import { OSUserController } from './osuser.controller';
import {OSUserService,LinuxOSUserService,WindowsOSUserService,
} from './osuser.service';@Module({imports: [],controllers: [OSUserController],providers: [LinuxOSUserService,WindowsOSUserService,{provide: 'OSUserServices',useFactory: (linuxOSUserService, windowsOSUserService) => [linuxOSUserService,windowsOSUserService,],inject: [LinuxOSUserService, WindowsOSUserService],},],
})
export class OSUserModule {}
总结
通过以上步骤,我们实现了在NestJS中注入多个实现了同一个接口的service的功能,这种变通的方法可以解决一些特殊场景下的注入问题。
相关文章:
NestJS中实现注入多个实现了同一个接口的Service
在NestJS中有一种场景,在注入的时候需要将多个实现了同一个接口的service都注入到系统里,而NestJS中默认时没有这种注入,此时我们可以使用一个变通的provider来实现这一功能。 看下面例子,假定我们有一个OSService接口࿰…...
Qt按钮美化教程
前言 Qt按钮美化主要有三种方式:QSS、属性和自绘 QSS 字体大小 font-size: 18px;文字颜色 color: white;背景颜色 background-color: rgb(10,88,163); 按钮边框 border: 2px solid rgb(114,188,51);文字对齐 text-align: left;左侧内边距 padding-left: 10…...
基于单片机的多功能蓝牙语音智能台灯(论文+源码)
1总体方案设计 通过需求分析,本设计多功能蓝牙语音智能台灯的系统框图如图2.1所示,系统架构包括主控制器STM32F103单片机、HC-06蓝牙通信模块、LU-ASR01语音识别模块、OLED液晶、LED灯、按键等器件,在使用时用户可以通过手机APP、语音识别、…...
第15章:Python TDD应对货币类开发变化(二)
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
算法随笔_13: 有效三角形的个数
上一篇:算法随笔_12:最短无序子数组-CSDN博客 题目描述如下: 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 算法…...
WSL 2 自动更新 虚拟 IP 到 window hosts
window下的wsl2 开发中使用到 域名映射,但是WSL2 每次启动都会被分配一个虚拟的 ip 地址,每次启动虚拟ip 都不一样,导致要频繁 更改 window 的 hosts 文件,太麻烦了,所以写一个自动执行的 .sh 脚本,每次启动…...
我在广州学Mysql 系列——触发器的使用
ℹ️大家好,我是练小杰,这周是春节前的最后一周了,现在一双手数都能数得过来了!! 本播客将学习MYSQL中触发器的相关概念以及基础命令~~ 回顾:👉【MYSQL视图相关例题】 数据库专栏👉【…...
【useCallback Hook】在多次渲染中缓存组件中的函数,避免重复创建函数
文章目录 什么是 useCallback?基本语法 为什么需要 useCallback?示例1. 避免子组件重复创建函数2. 作为 useEffect 的依赖项 注意事项总结 在 React 开发中,性能优化是一个重要的主题。随着应用规模的增长,组件的重新渲染可能会变…...
2025/1/20 学习Vue的第三天
玩性太大了玩得也不开心,天天看电视刷视频。 内心实在空洞。 最近天天看小红书上的外国人,结实外国友人(狗头)哈哈哈认识了不少人,有埃及的有美国的,还有天天看菲利普吃糖葫芦哈哈哈哈哈一个阳光的德国大男…...
Kotlin Bytedeco OpenCV 图像图像49 仿射变换 图像裁剪
Kotlin Bytedeco OpenCV 图像图像49 仿射变换 图像裁剪 1 添加依赖2 测试代码3 测试结果 在OpenCV中,仿射变换(Affine Transformation)和透视变换(Perspective Transformation)是两种常用的图像几何变换方法。 变换方…...
金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成
目录 一、投资模块(投资接口投资业务) 二、连接数据库封装 和 清洗数据 1、连接数据库 2、数据清洗 4、调用 三、批量执行测试用例 并 生成测试报告 四、持续集成 1、代码上传gitee 2、Jenkin持续集成 一、投资模块(投资接口投资业务…...
(快速入门)保姆级详细的 Midjourney 基础教程
一、前言篇 1. 1. AI 绘图是什么? AI 绘画,顾名思义就是利用人工智能进行绘画,是人工智能生成内容(AIGC)的一个应用场景。其主要原理简单来说就是收集大量已有作品数据,通过算法对它们进行解析,最后再生成新作品,而算法也便是 AI 绘画的核心,是它得以爆火的基础…...
leetcode——找到字符串中所有字母异位词(java)
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "…...
大文件上传服务-后端V1V2
文章目录 大文件上传概述:minio分布式文件存储使用的一些技术校验MD5的逻辑 uploadV1 版本 1uploadv2 版本 2 大文件上传概述: 之前项目做了一个文件上传的功能,最近看到有面试会具体的问这个上传功能的细节,把之前做的项目拿过来总结一下,自己写的一个…...
Single-Model and Any-Modality for Video Object Tracking——2024——cvpr-阅读笔记
Single-Model and Any-Modality for Video Object Tracking 摘要相关工作创新处MethodShared embeddingModal promptingRGB Tracker based on TransformerOverall ExperiimentDatasetRGB-D samples are sourced from DepthTrackRGB-T samples are extracted from LasHeRRGB-E s…...
阳振坤:AI 大模型的基础是数据,AI越发达,数据库价值越大
2024年1月12日,第四届OceanBase数据库大赛决赛在北京圆满落幕。在大赛的颁奖典礼上,OceanBase 首席科学家阳振坤老师为同学们献上了一场主题为“爱上数据库”的公开课,他不仅分享了个人的成长历程,还阐述了对数据库行业现状与未来…...
Linux磁盘空间不足,12个详细的排查方法
在Linux系统运维过程中,磁盘空间不足是一个常见且棘手的问题。当磁盘空间被占满时,系统的正常运行会受到影响,甚至可能导致服务中断。因此,迅速有效地排查和解决磁盘空间问题显得尤为重要。本文将详细介绍16个排查Linux磁盘空间问…...
Spring Web MVC综合案例
承接上篇文章——Spring Web MVC探秘,在了解Spring Web MVC背后的工作机制之后,我们接下来通过三个实战项目,来进一步巩固一下前面的知识。 一、计算器 效果展示:访问路径:http://127.0.0.1:8080/calc.html 前端代码&a…...
微软预测 AI 2025,AI Agents 重塑工作形式
1月初,微软在官网发布了2025年6大AI预测,分别是:AI模型将变得更加强大和有用、AI Agents将彻底改变工作方式、AI伴侣将支持日常生活、AI资源的利用将更高效、测试与定制是开发AI的关键以及AI将加速科学研究突破。 值得一提的是,微…...
lvgl性能调优
LV_USE_PERFORMANCE lvgl_performance 是 LVGL 提供的性能分析工具,可以帮助开发者评估和优化图形库的性能。在一些特定的版本中,lvgl_performance 是一个宏或者工具,用来分析性能瓶颈,特别是图形渲染的效率。 下面是如何使用 l…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
