美文网首页
Nest.js - Providers

Nest.js - Providers

作者: stevekeol | 来源:发表于2020-07-10 09:02 被阅读0次

    参考文档

    controllers处理 HTTP 请求并将更复杂的任务委托给providers.

    • Provider 只是一个用 @Injectable() 装饰器注释的类
    • 对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest运行时系统
    • Providers 是纯粹的 JavaScript 类,在其类声明之前带有 @Injectable()装饰器
    1. 服务
    //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 {
      //CatsService 是通过类构造函数注入的.
      constructor(private catsService: CatsService) {}
    
      @Post()
      async create(@Body() createCatDto: CreateCatDto) {
        this.catsService.create(createCatDto);
      }
    
      @Get()
      async findAll(): Promise<Cat[]> {
        return this.catsService.findAll();
      }
    }
    
    //interfaces/cat.interface.ts
    export interface Cat {
      name: string;
      age: number;
      breed: string;
    }
    
    // cats.service.ts : 负责数据存储和检索
    import { Injectable } from '@nestjs/common';
    import { Cat } from './interfaces/cat.interface';
    
    //Nest通过@Injectable()知道CatsService是一个装饰器.
    @Injectable()
    export class CatsService {
      private readonly cats: Cat[] = [];
    
      create(cat: Cat) {
        this.cats.push(cat);
      }
    
      findAll(): Cat[] {
        return this.cats;
      }
    }
    
    //用CLI创建服务类
    $ nest g service cats
    
    • server.ts中通过@Injectable()告诉Nest该类是一个Provier;
    • controller.ts中通过@Controller()告诉Nest该类是一个Controller;
    • controller.ts中类CatsController中的CatsService是通过类构造函数注入的,因此可以this.catsService使用;
    2. 依赖注入

    参考文章
    Nest是建立在强大的设计模式,通常称为依赖注入.

    • 依赖,是当类需要执行其功能时,所需要的服务或对象。 DI 是一种编码模式,其中的类会从外部源中请求获取依赖,而不是自己创建它们。
    • 我们创建的类提供了一个服务,@Injectable() 装饰器把它标记为可供注入的服务; 该注入器负责创建服务实例,并把它们注入到controller的类中。
    constructor(private readonly catsService: CatsService) {}
    
    3. 作用域 ---???

    Provider通常具有和应用程序生命周期相同的的生命周期('作用域'):应用程序启动时,必须解析依赖项,因此必须实例化每个Provider。当应用程序关闭时,每个Provider都将被销毁。但有方法可以改变Provider的生命周期,参考

    4. 自定义Provider ---?

    Nest有一个内置的控制反转("IOC")容器,可以解决Providers之间的关系。参考

    5. 默认Provider --- ?
    import { Injectable, Optional, Inject } from '@nestjs/common';
    
    @Injectable()
    export class HttpService<T> {
      constructor(
        @Optional() @Inject('HTTP_OPTIONS') private readonly httpClient: T
      ) {}
    }
    
    6. 基于属性的注入 - 略
    • 以上称之为基于构造函数的注入
    • 如果您的类没有扩展其他提供者,你应该总是使用基于构造函数的注入。
    7. 手动实例化 - 略

    相关文章

      网友评论

          本文标题:Nest.js - Providers

          本文链接:https://www.haomeiwen.com/subject/ikaccktx.html