提供者
提供者是 Nest 中的一个基本概念。 许多基本的 Nest 类可以被视为提供者 – 服务、存储库、工厂、助手等。 提供者的主要思想是它可以是 injected
作为依赖; 这意味着对象之间可以创建各种关系,并且对象的 "接线" 实例的功能可以在很大程度上委托给 Nest 运行时系统。
在上个章节我们为创建了user模块并自动生成了CURD代码,我们看到在生成的代码中,任何业务逻辑的处理都并非在user.controller.ts
文件中,而是放在了user.service.ts
文件下
服务
在user.service.ts
文件里,导出了一个UserService
,我们将其简称服务, 该服务将负责数据存储和检索,并设计为供 UserController 使用,因此将其定义为提供者是一个很好的候选者。
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
@Injectable()
export class UserService {
create(createUserDto: CreateUserDto) {
return 'This action adds a new user';
}
findAll() {
return `This action returns all user`;
}
}
我们的 UserService
是一个具有一个属性和两个方法的基本类。 唯一的新特性是它使用了 @Injectable()
装饰器。 @Injectable()
装饰器附加元数据,它声明 CatsService
是一个可以由 Nest IoC 容器管理的类
现在我们有了一个检索用户user的服务类,让我们在 UserController
中使用它:
import { Controller, Get, Ip, HostParam, Session, Header, Post, HttpCode, Redirect } 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(private readonly userService: UserService) { }
@Get("")
findAll() {
return this.userService.findAll()
}
}
UserService
是 injected
通过类构造函数。 请注意 private
语法的使用。 这种简写允许我们立即在同一位置声明和初始化 UserService
成员。
依赖注入
Nest
是围绕通常称为 依赖注入 的强大设计模式构建的。 我们建议阅读官方 Angular
文档中有关此概念的精彩文章。
在 Nest 中,由于 TypeScript
的功能,管理依赖非常容易,因为它们只是按类型解析。 在下面的示例中,Nest 将通过创建并返回 UserService
的实例来解析 userService
(或者,在单例的正常情况下,如果已在其他地方请求过,则返回现有实例)。 此依赖已解析并传递给控制器的构造函数(或分配给指示的属性)
constructor(private readonly userService: UserService) { }
现在,UserService
服务已经注册进来了,之后就可以正常调用UserService
下的方法了
findAll() {
return this.userService.findAll()
}