Nest入门教程 - 初识Providers

Providers

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

转存失败重新上传取消

在前面的章节中,我们已经创建了一个简单的控制器 CatsController 。控制器应处理 HTTP 请求并将更复杂的任务委托给 providers。Providers 是纯粹的 JavaScript 类,在其类声明之前带有 @Injectable()装饰器。

由于 Nest 可以以更多的面向对象方式设计和组织依赖性,因此我们强烈建议遵循 SOLID 原则。

服务

让我们从创建一个简单的 CatsService 开始。该服务将负责数据存储和检索,由其使用 CatsController,因此它被定义为provider是一个很好的选择。因此,我们用这个类来装饰 @Injectable()

cats.service.ts

import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';@Injectable()
export class CatsService {private readonly cats: Cat[] = [];create(cat: Cat) {this.cats.push(cat);}findAll(): Cat[] {return this.cats;}
}Copy to clipboardErrorCopied

要使用 CLI 创建服务类,只需执行 $ nest g service cats 命令。

我们的 CatsService 是具有一个属性和两个方法的基本类。唯一的新特点是它使用 @Injectable() 装饰器。该 @Injectable() 附加有元数据,因此 Nest 知道这个类是一个 Nest provider。需要注意的是,上面有一个 Cat 接口。看起来像这样:

export interface Cat {name: string;age: number;breed: string;
}Copy to clipboardErrorCopied

现在我们有一个服务类来检索 cat ,让我们在 CatsController 里使用它 :

cats.controller.ts

import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';@Controller('cats')
export class CatsController {constructor(private readonly catsService: CatsService) {}@Post()async create(@Body() createCatDto: CreateCatDto) {this.catsService.create(createCatDto);}@Get()async findAll(): Promise<Cat[]> {return this.catsService.findAll();}
}Copy to clipboardErrorCopied

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

依赖注入

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

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

constructor(private readonly catsService: CatsService) {}Copy to clipboardErrorCopied

作用域

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

定制providers

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

可选的providers

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

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

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

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

基于属性的注入

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

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

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

注册 provider

现在我们已经定义了 provider(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 {}Copy to clipboardErrorCopied

得益于此,Nest 现在将能够解决 CatsController 类的依赖关系。这就是我们目前的目录结构:

src
├── cats
│    ├──dto
│    │   └──create-cat.dto.ts
│    ├── interfaces
│    │       └──cat.interface.ts
│    ├──cats.service.ts
│    └──cats.controller.ts
├──app.module.ts
└──main.tsCopy to clipboardErrorCopied

译者署名

用户名 头像 职能 签名
@zuohuadong 翻译 专注于 caddy 和 nest,@zuohuadong at Github
@Drixn 翻译 专注于 nginx 和 C++,@Drixn
@Armor 翻译 专注于 Java 和 Nest,@Armor
@tangkai 翻译 专注于 React,@tangkai

Nest入门教程 - 初识Providers相关推荐

  1. Nest入门教程 - 初识控制器

    Nest入门教程 - 初识控制器 控制器 控制器负责处理传入的 请求 和向客户端返回 响应 . 控制器的目的是接收应用的特定请求.路由机制控制哪个控制器接收哪些请求.通常,每个控制器有多个路由,不同的 ...

  2. Nest入门教程 - 模块

    Nest入门教程 - 模块 模块 模块是具有 @Module() 装饰器的类. @Module() 装饰器提供了元数据,Nest 用它来组织应用程序结构. 每个 Nest 应用程序至少有一个模块,即根 ...

  3. Netty入门教程——初识Netty

    Netty入门教程之初识Netty,本次会写几篇文章来详细说下netty. 文章目录 什么是Netty 什么是Netty Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一 ...

  4. 后端框架 Nest 入门教程: 开发学生信息管理系统

    作为一个前端,是否有想过学习下后端,做一个完整的应用? 如果你只是想体验下服务器端,可以选择 Express[1].它更容易上手.如果你想做一个企业级应用,推荐使用 Nest. Nest[2] (Ne ...

  5. 新手必备pr 2021快速入门教程「一」初识premiere pro 工作界面

    PR2021快速入门教程,学完之后,你可以制作抖音视频,vlog,电影混剪,日常记录等!零基础,欢迎入坑! 本节内容: 在premiere pro2021入门教程的第一部分,我们主要介绍软件工作界面的 ...

  6. 零基础CSS入门教程(1)–初识CSS

    点此查看 所有教程.项目.源码导航 本文目录 1. 前言 2. HTML与CSS区别 3. CSS有哪些功能 4. 如何学习CSS 1. 前言 学习CSS是离不开HTML的,HTML是CSS的基础,如 ...

  7. arduino入门教程系列一:初识arduino

    为了照顾新手小伙伴,DF创客社区开始陆续更新一些arduino系列基础教程,帮助大家更好地入门! 先从Arduino入门教程开始吧. Arduino是什么? Arduino是一个开放源码电子原型平台, ...

  8. 人人都能看懂的 Python 装饰器入门教程

    大家好,我是萱萱! 之前的文章中提到,很多人认为理解了装饰器的概念和用法后,会觉得自己的 Python 水平有一个明显的提高. 但很多教程在一上来就会给出装饰器的定义以及基本用法,例如你一定会在很多文 ...

  9. Python入门教程:很多人推荐学 Python 入 IT ,如果学完 Python 找不到工作怎么办...

    Python入门教程:很多人推荐学 Python 入 IT ,但是如果学完 Python 找不到工作怎么办,这也是很多人担心的问题. 很多人推荐通过学习 Python 入行 IT 一是因为 Pytho ...

最新文章

  1. 人人都能成为安全防范的高手 ——《黑客新型攻击防范:深入剖析犯罪软件》
  2. HealthKit开发快速入门教程之HealthKit开发概述简介
  3. js获取被点击的元素以及子元素
  4. openssl证书及配置
  5. 【Todo】Tomcat与Jetty的比较 以及Tomcat架构的学习
  6. android onpagescrolled 参数,Android
  7. 进程相关概念、C程序的空间分配
  8. spring boot学习(2) SpringBoot 项目属性配置
  9. 每周精选:20万DBA都在关注的11个问题
  10. 【MySQL】MySQL USE 库的时候报错 Reading table information for completion of table and column names
  11. Visual Studio 2015正式企业(Enterprise)版
  12. ap_invoice_distributions_all到xla_ae_lines
  13. 宝元系统通讯软件recon_企业即时通讯工具需注意哪些问题
  14. POJ-1195-Mobile phones
  15. IS-IS详解(十六)——IS-IS 分片扩展
  16. 报文分析4、TCP协议的头结构
  17. jieba库(jieba库的介绍以及分词原理,jieba的三种模式和常用函数,利用Jieba模块进行中文词语的统计)
  18. 抖音壁纸小程序v1.0.2版本功能,新增达人入住功能
  19. python, echarts 实现世界地图地域流向地图
  20. 《Windows核心编程》读书笔记二十五章 未处理异常,向量化异常处理与C++异常

热门文章

  1. SSM简单参数传递与获取方法
  2. html5游戏制作入门系列教程(五)
  3. 教你如何塑造JavaScript牛逼形象
  4. -moz火狐 (firefox)CSS
  5. Flash AS3获取PHP数据(ActionScript3 + php + email)送ActionScript2
  6. GBDT与XGBOOST
  7. NSGA2算法及其代码
  8. Shell——运行Shell脚本
  9. 解决QT5中文显示出现乱码
  10. 数据表的查看 mysql