首页 > 其他分享 >NestJs 提供者

NestJs 提供者

时间:2023-03-31 16:34:03浏览次数:42  
标签:service 提供者 UserService2 user UserService import id NestJs

文档:https://docs.nestjs.cn/9/providers

Providers 是 Nest 的一个基本概念。

许多基本的 Nest 类可能被视为

provider - service, repository, factory, helper 等等。

他们都可以通过 constructor 注入依赖关系。

这意味着对象可以彼此创建各种关系,

并且“连接”对象实例的功能在很大程度上可以委托给 Nest运行时系统。

Provider 只是一个用 @Injectable() 装饰器注释的类。

基本用法

如: 我们通过

nest g resource user

创建的user 模块

user.service.ts

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

// 提供者:Provider 只是一个用 @Injectable() 装饰器注释的类。
@Injectable()
export class UserService {}

module 里面已经引入 service 在 providers 注入

import { Module } from '@nestjs/common';
// 引入service
import { UserService } from './user.service';

@Module({
  // 提供者注入
  providers: [UserService]
})
export class UserModule {}

image-20230331143654181

在Controller 可以使用注入好的 Service 了

import { Controller } from '@nestjs/common';
// 引入service
import { UserService } from './user.service';

@Controller('user')
export class UserController {
    constructor(
    	// 注入service
        private readonly userService : UserService
    ){}
}

service 第二种用法 自定义名称

第一种用法就是一个语法糖

在 NestJs 中,默认情况下,服务名称是与服务类名相同的字符串。如果我们需要自定义服务名称,可以在 @Injectable() 装饰器中使用 provide 属性指定服务名称。

其实他全称是这样的

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

@Module({
  controllers: [UserController],
  providers: [{
    provide: 'makalo_test',
    useClass: UserService
  }]
})
export class UserModule {}

自定义名称之后 需要用对应的@inject 取 不然找不到

constructor(@Inject('makalo_test') private readonly userService: UserService) {}

image-20230331154011214

自定义注入值

module.ts

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

@Module({
  controllers: [UserController],
  providers: [
    {
      provide: 'makalo_test',
      useClass: UserService
    },
    {
      provide: "JD",
      useValue: ['TB', 'PDD', 'MT', 'ELM']
    }
  ]
})
export class UserModule { }

image-20230331154731067

controller.ts

import { Controller, Get, Post, Body, Patch, Param, Delete, Inject } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';

@Controller('user')
export class UserController {
  constructor(
    @Inject('makalo_test') private readonly userService: UserService,
    // 自定义注入的值
    @Inject('JD') private readonly shopList:string[]
  ) {}

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.userService.create(createUserDto);
  }

  @Get()
  findAll() {
    // 使用
    return this.userService.findAll() + this.shopList;
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.userService.findOne(+id);
  }

  @Patch(':id')
  update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
    return this.userService.update(+id, updateUserDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.userService.remove(+id);
  }
}

image-20230331154851010

工厂模式

如果服务 之间有相互的依赖 或者逻辑处理 可以使用 useFactory

例:

我们将user.service 复制两份,分别命名为user.service2 和 3

image-20230331155240277

将 2 和 3 的类名改下,并将3的构造函数增加参数

constructor(userService2:UserService2){
    
}

module 里面注入

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { UserService2 } from './user.service2';
import { UserService3 } from './user.service3';

@Module({
  controllers: [UserController],
  providers: [
    {
      provide: 'makalo_test',
      useClass: UserService
    },
    {
      provide: "JD",
      useValue: ['TB', 'PDD', 'MT', 'ELM']
    },
    UserService2,
    {
      provide: "TestFactory",
      inject: [UserService2],
      useFactory(UserService2: UserService2) {
        return new UserService3(UserService2)
      }
    }
  ]
})
export class UserModule { }

image-20230331161226767

控制器里面使用

// 工厂模式
@Inject('TestFactory') private readonly testFactory:UserService3

image-20230331161513845

异步模式

useFactory 返回一个promise 或者其他异步操作

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { UserService2 } from './user.service2';
import { UserService3 } from './user.service3';

@Module({
  controllers: [UserController],
  providers: [
    {
      provide: 'makalo_test',
      useClass: UserService
    },
    {
      provide: "JD",
      useValue: ['TB', 'PDD', 'MT', 'ELM']
    },
    UserService2,
    {
      provide: "TestFactory",
      inject: [UserService2],
      useFactory(UserService2: UserService2) {
        return new UserService3(UserService2)
      }
    },
    {
      provide: "sync",
      async useFactory() {
        return await  new Promise((r) => {
          setTimeout(() => {
            r('sync')
          }, 3000)
        })
      }
    }
  ]
})
export class UserModule { }

image-20230331161939803

标签:service,提供者,UserService2,user,UserService,import,id,NestJs
From: https://www.cnblogs.com/makalochen/p/17276625.html

相关文章

  • Dubbo服务提供者如何优雅升级?
    文章首发于公众号:BiggerBoy。欢迎关注。往期文章推荐大坑!隐式转换导致索引失效...高性能分布式限流:Redis+Lua真香!MySQL索引知识点&常见问题汇总联合索引在B+树上的存储结构及数据查找方式Redis分布式锁实战Mybatis第三方PageHelper插件分页原理MySQL索引底层原理 一、问题交......
  • nestJs 控制器
    参考:https://docs.nestjs.cn/9/controllers控制器负责处理传入的请求和向客户端返回响应。控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。为了创建一个基本的控制器,我们使用类和装饰器。......
  • EF7数据库提供者的自定义值生成器
    本文将讲解提供者使用值生成器的原理。因代码太多,本文只摘要重要代码,并且删除了代码中的注释。如果您不了解,如何使用EF的值生成器?见这篇文章:《EF7创建模型值生成篇》?SqlS......
  • NestJS——Serverless(官方文档翻译)
    无服务器计算是一种云计算执行模型,其中云提供商按需分配计算机资源,代表其客户照顾服务器。当应用未使用时,不会为应用分配计算资源。定价基于应用程序(源)消耗的实际资源量。......
  • NestJS学习笔记
    起步要想使用nest需要先安装依赖#全局安装npmi-g@nestjs/cli#局部安装npmi-g@nestjs/cli创建需要使用以下命令(如果使用局部安装,每次使用nest命令都需要......
  • nestjs微信小程序登录授权
    前言nestjs官方文档是英文,太难搞了,摸索了两天,把经验记下来。以后备用目录结构|--src//项目根目录|--modules//模块比如用户模块,商品模块|--app//入口模......
  • 为K8S集群准备Ceph存储提供者
    随着K8S存储接口逐渐成熟并顺势推出CSI接口规范后,原来“in-tree”(树内)模式的很多存储插件也逐步迁移到了“out-of-tree”(树外)模式的CSI插件上,甚至有些原来支持的存......
  • NestJs使用之EntityMetadataNotFoundError: No metadata for "Article" was found.
    前言博主使用TypeRom配置数据库后,在请求数据库的findAll()方法时,报错,我的报错截图如下:我的实体也使用了@Entity进行了注册。而且引入方式正确。仍然报这个错误,我花费了......
  • Android笔记--内容提供者+Server端+Client端
    什么是内容提供者ContentProvider为App存取内部数据提供的统一的外部接口,让不同的应用之间得以实现数据共享ClientApp端用户输入数据的一端,或者说是用户读取到存储的数......
  • 小满nestjs(第二十六章 nestjs 第一个CURD)
    来了来了他来了我们学了这么久的第一个CURD前端Vue3tsElementui axios<template><divclass="wraps"><div><el-inputv-model="search.keyWo......