1
- # 提供者
1
+ # Providers
2
2
3
- 提供程序是 ` Nest ` 的一个基本概念。许多基本的 ` Nest ` 类可能被视为提供者 - ` service ` ,` repository ` , ` factory ` , ` helper ` 等等。 他们都可以通过 ` constructor ` ** 注入** 依赖关系。 这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 ` Nest ` 运行时系统。 提供者只是一个用 ` @Injectable() ` 装饰器注释的类。
3
+ Providers是 ` Nest ` 的一个基本概念。许多基本的 ` Nest ` 类可能被视为provider - ` service ` ,` repository ` , ` factory ` , ` helper ` 等等。 他们都可以通过 ` constructor ` ** 注入** 依赖关系。 这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 ` Nest ` 运行时系统。 Provider只是一个用 ` @Injectable() ` 装饰器注释的类。
4
4
5
5
![ ] ( https://docs.nestjs.com/assets/Components_1.png )
6
6
7
- 在前面的章节中,我们已经创建了一个简单的控制器 ` CatsController ` 。控制器应处理 ` HTTP ` 请求并将更复杂的任务委托给** 提供者 ** 。提供者是纯粹的 ` JavaScript ` 类,在其类声明之前带有 ` @Injectable() ` 装饰器。
7
+ 在前面的章节中,我们已经创建了一个简单的控制器 ` CatsController ` 。控制器应处理 ` HTTP ` 请求并将更复杂的任务委托给** providers ** 。Providers是纯粹的 ` JavaScript ` 类,在其类声明之前带有 ` @Injectable() ` 装饰器。
8
8
9
9
?> 由于 ` Nest ` 可以以更多的面向对象方式设计和组织依赖性,因此我们强烈建议遵循 [ SOLID] ( https://en.wikipedia.org/wiki/SOLID ) 原则。
10
10
11
11
## 服务
12
12
13
- 让我们从创建一个简单的 ` CatsService ` 开始。该服务将负责数据存储和检索,由其使用 ` CatsController ` ,因此它被定义为提供者是一个很好的选择 。因此,我们用这个类来装饰 ` @Injectable() ` 。
13
+ 让我们从创建一个简单的 ` CatsService ` 开始。该服务将负责数据存储和检索,由其使用 ` CatsController ` ,因此它被定义为provider是一个很好的选择 。因此,我们用这个类来装饰 ` @Injectable() ` 。
14
14
15
15
> cats.service.ts
16
16
@@ -34,7 +34,7 @@ export class CatsService {
34
34
35
35
?> 要使用 ` CLI ` 创建服务类,只需执行 ` $ nest g service cats ` 命令。
36
36
37
- 我们的 ` CatsService ` 是具有一个属性和两个方法的基本类。唯一的新特点是它使用 ` @Injectable() ` 装饰器。该 ` @Injectable() ` 附加有元数据,因此 ` Nest ` 知道这个类是一个 ` Nest ` 提供者 。需要注意的是,上面有一个 ` Cat ` 接口。看起来像这样:
37
+ 我们的 ` CatsService ` 是具有一个属性和两个方法的基本类。唯一的新特点是它使用 ` @Injectable() ` 装饰器。该 ` @Injectable() ` 附加有元数据,因此 ` Nest ` 知道这个类是一个 ` Nest ` provider 。需要注意的是,上面有一个 ` Cat ` 接口。看起来像这样:
38
38
39
39
``` typescript
40
40
export interface Cat {
@@ -81,20 +81,20 @@ Nest 是建立在强大的设计模式, 通常称为依赖注入。我们建议
81
81
``` typescript
82
82
constructor (private readonly catsService : CatsService ) {}
83
83
```
84
- ## 范围
84
+ ## 作用域
85
85
86
- 提供者通常具有与应用程序生命周期同步的生命周期(“范围 ”)。在启动应用程序时,必须解析每个依赖项,因此必须实例化每个提供程序。同样,当应用程序关闭时,每个提供者都将被销毁 。但是,有一些方法可以该标提供者生命周期的请求范围 。您可以[ 在此处] ( /6/fundamentals?id=注射范围 ) 详细了解这些技术。
86
+ Provider通常具有与应用程序生命周期同步的生命周期(“作用域 ”)。在启动应用程序时,必须解析每个依赖项,因此必须实例化每个提供程序。同样,当应用程序关闭时,每个provider都将被销毁 。但是,有一些方法可以该标provider生命周期的请求范围 。您可以[ 在此处] ( /6/fundamentals?id=注射范围 ) 详细了解这些技术。
87
87
88
88
89
- ## 定制提供者
89
+ ## 定制providers
90
90
91
- ` Nest ` 有一个内置的控制反转(` "IoC" ` )容器,可以解决提供者之间的关系 。 此功能是上述依赖注入功能的基础,但要比上面描述的要强大得多。` @Injectable() ` 装饰器只是冰山一角, 并不是定义提供程序的唯一方法 。相反,您可以使用普通值、类、异步或同步工厂。看看[ 这里] ( /6/fundamentals ) 找到更多的例子。
91
+ ` Nest ` 有一个内置的控制反转(` "IoC" ` )容器,可以解决providers之间的关系 。 此功能是上述依赖注入功能的基础,但要比上面描述的要强大得多。` @Injectable() ` 装饰器只是冰山一角, 并不是定义providers的唯一方法 。相反,您可以使用普通值、类、异步或同步工厂。看看[ 这里] ( /6/fundamentals ) 找到更多的例子。
92
92
93
- ## 可选的提供者
93
+ ## 可选的providers
94
94
95
- 有时,您可能需要解决一些依赖项。例如,您的类可能依赖于一个** 配置对象** ,但如果没有传递,则应使用默认值。在这种情况下,关联变为可选的,提供者不会因为缺少配置导致错误 。
95
+ 有时,您可能需要解决一些依赖项。例如,您的类可能依赖于一个** 配置对象** ,但如果没有传递,则应使用默认值。在这种情况下,关联变为可选的,provider不会因为缺少配置导致错误 。
96
96
97
- 要指示提供程序是可选的 ,请在 ` constructor ` 的参数中使用 ` @optional() ` 装饰器。
97
+ 要指示provider是可选的 ,请在 ` constructor ` 的参数中使用 ` @optional() ` 装饰器。
98
98
99
99
``` typescript
100
100
import { Injectable , Optional , Inject } from ' @nestjs/common' ;
@@ -107,11 +107,11 @@ export class HttpService<T> {
107
107
}
108
108
```
109
109
110
- 请注意,在上面的示例中,我们使用自定义提供程序 ,这是我们包含 ` HTTP_OPTIONS ` 自定义标记的原因。前面的示例显示了基于构造函数的注入,通过构造函数中的类指示依赖关系。[ 在此处] ( /6/fundamentals ) 详细了解自定义提供程序及其关联的 ` token ` 。
110
+ 请注意,在上面的示例中,我们使用自定义provider ,这是我们包含 ` HTTP_OPTIONS ` 自定义标记的原因。前面的示例显示了基于构造函数的注入,通过构造函数中的类指示依赖关系。[ 在此处] ( /6/fundamentals ) 详细了解自定义providers及其关联的 ` token ` 。
111
111
112
112
## 基于属性的注入
113
113
114
- 我们目前使用的技术称为基于构造函数的注入,即通过构造函数方法注入提供程序 。在某些非常特殊的情况下,基于属性的注入可能会有用。例如,如果顶级类依赖于一个或多个提供者 ,那么通过从构造函数中调用子类中的 ` super() ` 来传递它们就会非常烦人了。因此,为了避免出现这种情况,可以在属性上使用 ` @inject() ` 装饰器。
114
+ 我们目前使用的技术称为基于构造函数的注入,即通过构造函数方法注入providers 。在某些非常特殊的情况下,基于属性的注入可能会有用。例如,如果顶级类依赖于一个或多个providers ,那么通过从构造函数中调用子类中的 ` super() ` 来传递它们就会非常烦人了。因此,为了避免出现这种情况,可以在属性上使用 ` @inject() ` 装饰器。
115
115
116
116
``` typescript
117
117
import { Injectable , Inject } from ' @nestjs/common' ;
@@ -123,11 +123,11 @@ export class HttpService<T> {
123
123
}
124
124
```
125
125
126
- !> 如果您的类没有扩展其他提供程序 ,你应该总是使用基于** 构造函数** 的注入。
126
+ !> 如果您的类没有扩展其他provider ,你应该总是使用基于** 构造函数** 的注入。
127
127
128
- ## 注册提供者
128
+ ## 注册provider
129
129
130
- 现在我们已经定义了提供程序 (` CatsService ` ),并且已经有了该服务的使用者(` CatsController ` ),我们需要在 ` Nest ` 中注册该服务,以便它可以执行注入。 为此,我们可以编辑模块文件(` app.module.ts ` ),然后将服务添加到` @Module() ` 装饰器的` providers ` 数组中。
130
+ 现在我们已经定义了provider (` CatsService ` ),并且已经有了该服务的使用者(` CatsController ` ),我们需要在 ` Nest ` 中注册该服务,以便它可以执行注入。 为此,我们可以编辑模块文件(` app.module.ts ` ),然后将服务添加到` @Module() ` 装饰器的` providers ` 数组中。
131
131
132
132
> app.module.ts
133
133
0 commit comments