Skip to content

服务提供者

服务提供者是普通的 JavaScript 类,具有生命周期方法来在应用程序的不同阶段执行操作。

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

服务提供者是 AdonisJS 应用程序的入口点,具有在应用程序被认为就绪之前修改应用程序状态的能力。它主要被外部包用来挂接到应用程序生命周期

TIP

如果你只想将依赖项注入到你的某个类中,可以使用依赖注入功能。

提供者在 adonisrc.ts 文件的 providers 数组中注册。该值是一个延迟导入服务提供者的函数。

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

默认情况下,提供者在所有运行时环境中加载。但是,你可以将提供者限制为在特定环境中运行。

ts
{
  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 命令

ts
import { ApplicationService } from '@adonisjs/core/types'

export default class AppProvider {
  constructor(protected app: ApplicationService) {
  }
}

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

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

register

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

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

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

boot

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

ts
export default class AppProvider {
  async boot() {
   const validator = await this.app.container.make('validator')
    
   // 添加自定义验证规则
   validator.rule('foo', () => {})
  }
}

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

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

start

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

ready

ready 方法根据应用程序的环境在不同阶段被调用。

web HTTP 服务器启动并准备好接受请求后调用 ready 方法。
console在主命令的 run 方法之前调用 ready 方法。
test在运行所有测试之前调用 ready 方法。但是,测试文件在 ready 方法之前导入。
repl在终端显示 REPL 提示符之前调用 ready 方法。
ts
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

当 AdonisJS 正在优雅地退出应用程序时,shutdown 方法被调用。

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

ts
export default class AppProvider {
  async shutdown() {
    // 执行清理
  }
}