zoukankan      html  css  js  c++  java
  • [Nest] 03.nest之提供者 provider

    提供者 provider

    提供程序是 Nest 的一个基本概念。许多基本的 Nest 类可能被视为提供者 - service,repository, factory, helper 等等。 他们都可以通过 constructor 注入依赖关系。 这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest 运行时系统。 提供者只是一个用 @Injectable()装饰器注释的类。

    控制器应处理 HTTP 请求并将更复杂的任务委托给提供者。提供者是纯粹的 JavaScript 类,在其类声明之前带有 @Injectable()装饰器。

    service

    创建一个 image.service 使用命令nest g service image,该服务将负责数据存储和检索,由 Controller 使用.

    import { Injectable } from '@nestjs/common';
    import { createCanvas } from 'canvas';
    import { createWriteStream, readFileSync, writeFile } from 'fs';
    import { config } from '../../global.config';
    import { ensureDirSync, ensureFileSync } from 'fs-extra';
    import * as path from 'path';
    
    const STATIC_PATH = path.join(__dirname, `../../static`);
    
    @Injectable()
    export class ImageService {
    
      public async createPlaceImage(
        params: { wh: string; color: string; textcolor: string },
        query: { text: string },
      ) {
        ......
      }
    
      public async uplodaImage(image: any) {
        ......
      }
    }
    
    

    该 Service 使用 @Injectable() 装饰器。该 @Injectable() 附加有元数据,因此 Nest 知道这个类是一个 Nest 提供者。

    在控制器中使用

    import {
      Controller,
      Get,
      Param,
      Post,
      Query,
      Header,
      UploadedFile,
      UseInterceptors,
      Body,
    } from '@nestjs/common';
    import { ImageService } from './image.service';
    import { FileInterceptor } from '@nestjs/platform-express';
    
    @Controller('/image')
    export class ImageController {
      constructor(private readonly imageService: ImageService) {}
    
      @Get(':wh/:color/:textcolor')
      @Header('Content-Type', 'image/*')
      public async createImage(
        @Param()
        params: {
          wh: string;
          color: string;
          textcolor: string;
        },
        @Query() query: { text: string },
      ) {
        ......
      }
    
      @Post('upload')
      @UseInterceptors(FileInterceptor('image'))
      public async uploadFile(@UploadedFile() image: any, @Body() body: any) {
        ......
      }
    }
    

    Service 是通过类构造函数注入的。这里使用了私有的只读语法,意味着我们已经在同一位置创建并初始化了 Service 成员。

    依赖注入

    Nest 是建立在强大的设计模式, 通常称为依赖注入。我们建议在官方的 Angular 文档中阅读有关此概念的精彩文章。

    在 Nest 中,借助 TypeScript 功能,管理依赖项非常容易,因为它们仅按类型进行解析。在下面的示例中,Nest 将 catsService 通过创建并返回一个实例来解析 CatsService(或者,在单例的正常情况下,如果现有实例已在其他地方请求,则返回现有实例)。解析此依赖关系并将其传递给控制器的构造函数(或分配给指定的属性):

    constructor(private readonly imageService: ImageService) {}
    

    范围

    提供者通常具有与应用程序生命周期同步的生命周期(“范围”)。在启动应用程序时,必须解析每个依赖项,因此必须实例化每个提供程序。同样,当应用程序关闭时,每个提供者都将被销毁。但是,有一些方法可以该标提供者生命周期的请求范围。您可以在此处详细了解这些技术。

    定制提供者

    Nest 有一个内置的控制反转("IoC")容器,可以解决提供者之间的关系。 此功能是上述依赖注入功能的基础,但要比上面描述的要强大得多。@Injectable() 装饰器只是冰山一角, 并不是定义提供程序的唯一方法。相反,您可以使用普通值、类、异步或同步工厂。看看这里找到更多的例子。

    可选的提供者

    有时,您可能需要解决一些依赖项。例如,您的类可能依赖于一个配置对象,但如果没有传递,则应使用默认值。在这种情况下,关联变为可选的,提供者不会因为缺少配置导致错误。

    要指示提供程序是可选的,请在 constructor 的参数中使用 @optional() 装饰器。

    import { Injectable, Optional, Inject } from '@nestjs/common';
    
    @Injectable()
    export class HttpService<T> {
      constructor(
        @Optional() @Inject('HTTP_OPTIONS') private readonly httpClient: T
      ) {}
    }
    

    请注意,在上面的示例中,我们使用自定义提供程序,这是我们包含 HTTP_OPTIONS 自定义标记的原因。前面的示例显示了基于构造函数的注入,通过构造函数中的类指示依赖关系。在此处详细了解自定义提供程序及其关联的 token。

    基于属性的注入

    我们目前使用的技术称为基于构造函数的注入,即通过构造函数方法注入提供程序。在某些非常特殊的情况下,基于属性的注入可能会有用。例如,如果顶级类依赖于一个或多个提供者,那么通过从构造函数中调用子类中的 super() 来传递它们就会非常烦人了。因此,为了避免出现这种情况,可以在属性上使用 @inject() 装饰器。

    import { Injectable, Inject } from '@nestjs/common';
    
    @Injectable()
    export class HttpService<T> {
      @Inject('HTTP_OPTIONS')
      private readonly httpClient: T;
    }
    
    

    如果您的类没有扩展其他提供程序,你应该总是使用基于构造函数的注入。

    注册提供者

    现在我们已经定义了提供程序(CatsService),并且已经有了该服务的使用者(CatsController),我们需要在 Nest 中注册该服务,以便它可以执行注入。 为此,我们可以编辑模块文件(app.module.ts),然后将服务添加到@Module()装饰器的 providers 数组中。

    app.module.ts

    import { Module } from '@nestjs/common';
    import { CatsController } from './cats/cats.controller';
    import { CatsService } from './cats/cats.service';
    
    @Module({
      controllers: [CatsController],
      providers: [CatsService],
    })
    export class AppModule {}
    
  • 相关阅读:
    pycharm专业版破解
    XSS漏洞扫描工具:BruteXSS
    人生第一次成功的sql注入
    黑客学习之信息收集
    redhat 下搭建网站
    网络安全渗透--判断网站使用何种网页语言,判断网站所用服务器
    jqgrid表头上面再加一行---二级表头
    实验吧 burpsuie拦截修改请求
    实验吧 貌似有点难 伪造ip
    实验吧 这个看起来有点简单!&渗透测试工具sqlmap基础教程
  • 原文地址:https://www.cnblogs.com/mybilibili/p/12085254.html
Copyright © 2011-2022 走看看