服务提供者
服务提供者(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
}
}