概述 - 提供者

优质
小牛编辑
129浏览
2023-12-01

几乎所有的东西都可以被认为是提供者 - service, repository, factory, helper 等等。他们都可以注入依赖关系 constructor,也就是说,他们可以创建各种关系。但事实上,提供者不过是一个用@Injectable() 装饰器注解的简单类。

提供者 - 图1

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

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

我们来创建一个简单的 CatsService 提供者:

cats.service.ts

  1. import { Injectable } from '@nestjs/common';
  2. import { Cat } from './interfaces/cat.interface';
  3. @Injectable()
  4. export class CatsService {
  5. private readonly cats: Cat[] = [];
  6. create(cat: Cat) {
  7. this.cats.push(cat);
  8. }
  9. findAll(): Cat[] {
  10. return this.cats;
  11. }
  12. }

这是一个 CatsService 基本类,有一个属性和两个方法。唯一的新特点是它使用 @Injectable() 装饰器。该 @Injectable() 附加的元数据,从而 Nest 知道这个类是一个 Nest 提供者。

?> Cat 上面有一个界面。我们没有提到它,因为这个模式与 CreateCatDto 我们在前一章中创建的类完全相同。

由于我们已经完成了服务类,所以我们在以下内容中使用它 CatsController :

cats.controller.ts

  1. import { Controller, Get, Post, Body } from '@nestjs/common';
  2. import { CreateCatDto } from './dto/create-cat.dto';
  3. import { CatsService } from './cats.service';
  4. import { Cat } from './interfaces/cat.interface';
  5. @Controller('cats')
  6. export class CatsController {
  7. constructor(private readonly catsService: CatsService) {}
  8. @Post()
  9. async create(@Body() createCatDto: CreateCatDto) {
  10. this.catsService.create(createCatDto);
  11. }
  12. @Get()
  13. async findAll(): Promise<Cat[]> {
  14. return this.catsService.findAll();
  15. }
  16. }

在 CatsService 通过类构造函数注入。不要害怕 private readonly 缩短的语法。这意味着我们已经在同一位置创建并初始化了 catsService 成员。

依赖注入

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

在 Nest 中,由于 TypeScript 的缘故,管理依赖关系非常简单,因为它们只是按类型解决,然后注入控制器的构造函数中:

  1. constructor(private readonly catsService: CatsService) {}

定制提供者

Nest 用来解决提供者之间关系的控制反转要比上面描述的要强大得多。@Injectable() 装饰器只是冰山一角, 不需要严格定义提供商。相反,您可以使用普通值,类,异步或同步工厂。看看这里找到更多的例子。

最后一步

app.module.ts

  1. import { Module } from '@nestjs/common';
  2. import { CatsController } from './cats/cats.controller';
  3. import { CatsService } from './cats/cats.service';
  4. @Module({
  5. controllers: [CatsController],
  6. providers: [CatsService],
  7. })
  8. export class ApplicationModule {}

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

  1. src
  2. ├── cats
  3. │ ├──dto
  4. │ │ └──create-cat.dto.ts
  5. │ ├── interfaces
  6. │ │ └──cat.interface.ts
  7. │ ├──cats.service.ts
  8. │ └──cats.controller.ts
  9. ├──app.module.ts
  10. └──main.ts

最后更新:

类似资料

  • 概述 国际化和本地化的目的就是让一个网站应用能做到根据用户语种和指定格式的不同而提供不同的内容。 Django 对文本翻译, 日期、时间和数字的格式化,以及时区提供了完善的支持。 实际上,Django做了两件事: 由开发者和模板作者指定应用的哪些部分应该翻译,或是根据本地语种和文化进行相应的格式化。 根据用户的偏好设置,使用钩子将web应用本地化。 很显然,翻译取决于用户所选语言,而格式化通常取决

  • 虽然Django 满满的便捷性让Web 开发人员活得轻松一些,但是如果不能轻松地部署你的网站,这些工具还是没有什么用处。Django 起初,易于部署就是一个主要的目标。有许多优秀的方法可以轻松地来部署Django: 如何使用WSGI 部署 部署的检查清单 FastCGI 的支持已经废弃并将在Django 1.9 中删除。 如何使用FastCGI、SCGI 和AJP 部署Django 如果你是部署D

  • 本书概述 进程的概念大家都很熟悉,但你是否能准确说出僵尸进程的含义呢?还有 COW(Copy On Write)、Flock(File Lock)、Epoll 和 Namespace 的概念又是否了解过呢? 本书汇集了进程方方面面的基础知识,加上编程实例,保证阅读后能自如地回答以上问题,在项目开发中对进程的优化也有更深的理解。 本书架构 本书按循序渐进的方式介绍进程的基础概念和拓展知识,主要涵盖以

  • Docker在1.12.0和以上版本中增加了swarm模式。通过swarm模式管理的Docker Engines集群称之为“Swarm”。并可以通过Docker CLI来创建Swarm,在Swarm中部署应用服务,以及管理Swarm。 功能特点 在Docker Engines中集成了集群管理功能:通过Docker CLI可以创建一个用来发布应用services的swarm,而不需要安装其他任何额外

  • 这是 Elasticsearch 官方的 PHP 客户端。我们把 Elasticsearch-PHP 设计成低级客户端(低级设计模式),使用时不会偏离 REST API 的用法。 客户端所有方法几乎都与 REST API 对应,而且也与其他编程语言的客户端(如 ruby, python 等)方法结构相似。我们希望这种对应方式可以方便开发者更加容易上手客户端,且以最小的代价快速从一种编程语言转换到另

  • 特点 为什么用 Groovy?