NestJS中使用DynamicModule实现模块动态加载

news/2024/12/23 20:45:02 标签: NestJS

1. 介绍

NestJS中,模块是组织代码的基本单元,它将相关的服务和控制器组织在一起。然而,在某些情况下,我们可能需要根据不同的条件动态加载模块,以满足不同的业务需求。这时,就可以使用DynamicModule了。

DynamicModule是NestJS提供的一种动态加载模块的方式,它允许我们在运行时动态地加载模块,看下面的例子。

2. 首先创建一个模块,比如这里的 config service和module

config.service.ts

import { Injectable, Inject } from '@nestjs/common';
import * as fs from 'fs';

@Injectable()
export class ConfigService {
  constructor(@Inject('CONFIG_OPTIONS') private options: any) {
    // TODO load config from options
    console.log('load config from ', options.folder);
  }

  get(key: string): string {
    // TODO get config
    console.log('get config value ...');
    return 'hello world';
  }
}

config.module.ts

import { DynamicModule, Module } from '@nestjs/common';
import { ConfigService } from './config.service';

@Module({})
export class ConfigModule {
  static register(options: any): DynamicModule {
    return {
      module: ConfigModule,
      providers: [
        {
          provide: 'CONFIG_OPTIONS',
          useValue: options,
        },
        ConfigService,
      ],
      exports: [ConfigService],
    };
  }
}

3. 在主模块中导入动态模块

app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from './plugins/config/config.module';
import * as path from 'path';

@Module({
  imports: [ConfigModule.register({ folder: './config' })],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  • 作为例子这里传递一个配置项 folder,在config.service.ts中会用到。

4. 在控制器中使用动态模块服务

app.controller.ts

import { Controller, Get, Inject } from '@nestjs/common';
import { AppService } from './app.service';
import { ConfigService } from './plugins/config/config.service';

@Controller()
export class AppController {
  constructor(
    private readonly appService: AppService,
    @Inject(ConfigService)
    private readonly configService: ConfigService,
  ) {}

  @Get()
  async getHello() {
    console.log(this.configService.get('key'));

    return this.appService.getHello();
  }
}

http://www.niftyadmin.cn/n/5796979.html

相关文章

豆包MarsCode:小U的数字插入问题

问题描述 问题分析 问题的核心是找到将数字 b 插入到数字 a 的某个位置后,使形成的数字尽可能大。需要仔细分析以下几个要点: 1. 分析数字的特性 输入的两个数字: a 是一个正整数(例如 76543)。b 是一个非负整数&am…

金融保险行业数字化创新实践:如何高效落地自主可控的企业级大数据平台

使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量替代 OGG, Kettle 等同步工具,以及基于 Kafka 的 ETL 解决方案,「CDC 流处理 数据集成」组合拳,加速仓内数据流转,帮助企业…

CTF入门:以Hackademic-RTB1靶场为例初识夺旗

一、网络扫描 靶机ip地址为192.168.12.24 使用nmap工具进行端口扫描 nmap -sT 192.168.12.24 二、信息收集 1、80端口探索 靶机开放了80和22端口,使用浏览器访问靶机的80端口,界面如下: 点击target发现有跳转,并且url发生相应变…

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC(Two-Phase Commit)协议准备阶段提交阶段情况 1:只要有一个事务参与者反馈未就绪(no ready),事务协调者就会回滚事务情况 2:当所有事务参与者均反馈就绪(ready&a…

常用类晨考day15

1.基本数据类型以及对应包装类 Byte Short Integer Long Float Double Boolean Character 2.什么是自动拆箱和装箱,jdk版本有什么要求?代码举 例并标明 Integer a 100; // 装箱 int b a; // 拆箱 从JDK1.5才开始支持 3.NumberFormatException是什么异常…

ES6学习函数(四)

这里写目录标题 一、带参数默认值的函数二、rest参数三、箭头函数一、箭头函数二、箭头函数的作用2.1、使表达更加简洁2.2、简化回调函数 三、箭头函数使用注意点3.1、没有this绑定3.2、箭头函数中没有arguments对象3.3、箭头函数不能使用new关键字来实例化对象 一、带参数默认…

c++---------数据类型

基本数据类型 整数类型(Integral Types) int(整型) 这是最常用的整数类型,通常用于存储一般范围的整数值。在32位系统中,int类型一般占用4个字节,取值范围大约是 - 2147483648到2147483647。例如…

Cmd命令大全(万字详细版)

1. 常用命令 1.1 cd命令 //进入d盘 D: //进入F盘 F: cd /? //获取使用帮助cd \ //跳转到硬盘的根目录cd C:\WINDOWS //跳转到当前硬盘的其他文件d: //跳转到其他硬盘cd /d e:\software //跳转到其他硬盘的其他文件夹,注意此处必须加/d参数。…