服务提供者

服务提供者

服务提供者(service provider)是带有生命周期方法的普通 JavaScript 类,用于在应用的不同阶段执行操作。

一个服务提供者可以向容器注册绑定扩展已有的绑定,或者在 HTTP 服务器启动后运行操作。

服务提供者是 AdonisJS 应用的入口点,能够在应用被认为就绪之前修改应用状态。它主要被外部软件包用来钩入应用的生命周期

如果你只是想向你的某个类注入依赖,可以使用依赖注入功能。

这些提供者在 adonisrc.ts 文件的 providers 数组下注册。其值为一个用于惰性导入服务提供者的函数

{
providers: [
() => import('@adonisjs/core/providers/app_provider'),
() => import('./providers/app_provider.js'),
]
}

默认情况下,一个提供者会在所有运行时环境中被加载。不过,你可以将提供者限制为只在特定环境中运行。

{
providers: [
() => import('@adonisjs/core/providers/app_provider'),
{
file: () => import('./providers/app_provider.js'),
environment: ['web', 'repl']
}
]
}

编写服务提供者

服务提供者存储在你的应用的 providers 目录中。或者,你也可以使用 node ace make:provider app 命令。

提供者模块必须有一个 export default 语句,返回该提供者类。类的构造函数接收一个 Application 类的实例。

另请参阅:make provider 命令

import { ApplicationService } from '@adonisjs/core/types'
export default class AppProvider {
constructor(protected app: ApplicationService) {
}
}

以下是你可以实现用来执行不同操作的生命周期方法。

export default class AppProvider {
register() {
}
async boot() {
}
async start() {
}
async ready() {
}
async shutdown() {
}
}

register

register 方法在提供者类的实例被创建之后被调用。register 方法可以在 IoC 容器内注册绑定。

register 方法是同步的,因此你不能在该方法内使用 Promise。

export default class AppProvider {
register() {
this.app.container.bind('db', () => {
return new Database()
})
}
}

boot

boot 方法在所有绑定都已注册到 IoC 容器之后被调用。在该方法内部,你可以从容器中解析绑定以扩展/修改它们。

export default class AppProvider {
async boot() {
const validator = await this.app.container.make('validator')
// Add custom validation rules
validator.rule('foo', () => {})
}
}

在从容器解析绑定时扩展它们是一个好的实践。例如,你可以使用 resolving 钩子向校验器添加自定义规则。

async boot() {
this.app.container.resolving('validator', (validator) => {
validator.rule('foo', () => {})
})
}

start

start 方法在 boot 之后、ready 方法之前被调用。它允许你执行 ready 钩子操作可能需要用到的操作。

ready

ready 方法的调用时机根据应用的环境而不同。

web ready 方法在 HTTP 服务器已经启动并准备好接受请求之后被调用。
console ready 方法在主命令的 run 方法即将执行之前被调用。
test ready 方法在运行所有测试之前被调用。不过,测试文件会在 ready 方法之前被导入。
repl ready 方法在 REPL 提示符显示到终端之前被调用。
export default class AppProvider {
async start() {
if (this.app.getEnvironment() === 'web') {
}
if (this.app.getEnvironment() === 'console') {
}
if (this.app.getEnvironment() === 'test') {
}
if (this.app.getEnvironment() === 'repl') {
}
}
}

shutdown

shutdown 方法在 AdonisJS 正处于优雅退出应用的过程中时被调用。

退出应用的事件取决于应用运行的环境,以及应用进程是如何启动的。请阅读应用生命周期指南以了解更多相关信息。

export default class AppProvider {
async shutdown() {
// perform the cleanup
}
}