NestJS -自定义依赖的实现记录

简介

  1. 如何基于 NestJS 这套依赖管理机制,去封装公共依赖
  2. 什么时候用 inject

如何基于 NestJS 这套依赖管理机制,去封装公共依赖

全局注入

首先定义一个 InjectableClass:

import { Injectable } from '@nestjs/common';

@Injectable()
export class Utils {
  add(val: number) {
    return val + 2;
  }
}

.module 注入这个依赖

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { Utils } from './utils';

@Module({
  controllers: [UserController],
  providers: [UserService, Utils],
})
export class UserModule {}

然后就可以在同样是 Injectable.service 使用:

import { Injectable } from '@nestjs/common';
import { Utils } from './utils';

@Injectable()
export class UserService {
  constructor(readonly utils: Utils) {}
  findAll() {
    console.log(this.utils.add(2));
    return `This action returns all user`;
  }
}

同理,也能在这个 module 下的 controller 使用

同理,如果想将这个 Class 在全局都使用,可以直接在 app.module 进行注入

通过 import module 来获取依赖

定义一个 common.module.ts:

import { Module } from '@nestjs/common';
import { Utils } from './user/utils';

@Module({
  providers: [Utils],
  exports: [Utils],
})
export class CommonModule {}

通过 exports 暴露你想要暴露的依赖,然后对应模块引入该模块:

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
// import { Utils } from './utils';
import { CommonModule } from 'src/common.module';

@Module({
  imports: [CommonModule],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}

这样 user 模块中的依赖,还是能使用 Utils

总结

  1. 通过模块的全局注入,比较简单直接,一劳永逸
  2. 而通过 import module 来获取该模块暴露的依赖,我个人感觉这比较倾向于在一些工具库封装时才用到

为什么有些依赖注入需要用到 Inject

在上面的例子中,都是不需要 Inject 装饰器,但在使用一些库的时候,则需要使用:

import { Inject, Injectable } from '@nestjs/common';
import { CACHE_MANAGER } from '@nestjs/cache-manager';
import { Cache } from 'cache-manager';

@Injectable()
export class PersonalService {
  constructor(
    @Inject(CACHE_MANAGER)
    private cacheManager: Cache,
  ) {}
}

当你定义 providers 时要规定 provide 值,就需要用到 Inject

import { Module } from '@nestjs/common';
import { Utils } from './user/utils';

@Module({
  providers: [
    {
      provide: 'ddd',
      useClass: Utils,
    },
  ],
  exports: ['ddd'],
})
export class CommonModule {}

import { Inject, Injectable } from '@nestjs/common';
import { Utils } from './utils';

@Injectable()
export class UserService {
  constructor(
    @Inject('ddd')
    readonly utils: Utils,
  ) {}
  findAll() {
    console.log(this.utils.add(2));
    return `This action returns all user`;
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@icapps/nestjs-prisma是一个基于Prisma ORM的NestJS模块,它可以帮助我们快速地集成Prisma ORM到NestJS应用程序中。如果你需要集成多个数据库,可以按照以下步骤进行: 1. 首先,在项目中安装Prisma ORM,并为每个数据库创建一个Prisma schema。 2. 创建一个新的Prisma client实例,该实例将连接到特定的数据库。你可以在NestJS的providers中创建多个Prisma服务,每个服务都使用不同的Prisma client实例。 3. 在使用@icapps/nestjs-prisma模块时,你可以将不同的Prisma服务注入到不同的模块或控制器中,以便在应用程序中访问多个数据库。 下面是一个简单的示例,展示了如何在NestJS应用程序中集成多个Prisma服务: ```typescript import { Module } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; import { PrismaService } from '@icapps/nestjs-prisma'; @Module({ providers: [ { provide: 'DB_ONE', useFactory: () => new PrismaClient({ datasources: { db: { url: 'XXXXXXXX' } } }), }, { provide: 'DB_TWO', useFactory: () => new PrismaClient({ datasources: { db: { url: 'XXXXXXXX' } } }), }, { provide: 'DB_THREE', useFactory: () => new PrismaClient({ datasources: { db: { url: 'XXXXXXXX' } } }), }, { provide: 'DB_FOUR', useFactory: () => new PrismaClient({ datasources: { db: { url: 'XXXXXXXX' } } }), }, PrismaService, ], }) export class AppModule {} ``` 在上面的示例中,我们创建了四个不同的Prisma服务,每个服务使用不同的Prisma client实例,并将它们的provider名称分别设置为`'DB_ONE'`、`'DB_TWO'`、`'DB_THREE'`和`'DB_FOUR'`。然后,我们将这些服务注入到应用程序的providers列表中,并为每个服务指定相应的Prisma client实例。最后,我们还将@icapps/nestjs-prisma的PrismaService也添加到providers中,以便在整个应用程序中访问Prisma服务。 当我们需要在控制器或模块中使用Prisma时,可以通过注入相应的Prisma服务来访问不同的数据库,例如: ```typescript import { Controller, Get, Inject } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; @Controller('users') export class UsersController { constructor( @Inject('DB_ONE') private readonly dbOne: PrismaClient, @Inject('DB_TWO') private readonly dbTwo: PrismaClient, @Inject('DB_THREE') private readonly dbThree: PrismaClient, @Inject('DB_FOUR') private readonly dbFour: PrismaClient, ) {} @Get() async getUsers() { const users1 = await this.dbOne.user.findMany(); const users2 = await this.dbTwo.user.findMany(); const users3 = await this.dbThree.user.findMany(); const users4 = await this.dbFour.user.findMany(); return { users1, users2, users3, users4 }; } } ``` 在上面的示例中,我们在控制器中注入了四个不同的Prisma服务,每个服务使用不同的Prisma client实例。然后,我们可以使用这些服务来查询不同的数据库,并将结果返回给客户端。 希望这个示例能够帮助你实现NestJS集成多个数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值