服务 (Service)
字数
331 字
阅读时间
2 分钟
服务是挂载在上下文 ctx 上、用于跨插件共享功能的对象。插件可以通过继承 Service 基类来定义服务,并在构造函数中调用 super(ctx, name) 将其实例绑定至 ctx[name]。
定义
通过继承 Service 基类即可声明自定义服务:
ts
import { Service } from 'cordis'
import type { Context } from 'cordis'
export default class GreeterService extends Service {
static inject = ['database']
constructor(ctx: Context) {
super(ctx, 'greeter')
}
}使用 static inject 声明服务自身所需的依赖,Cordis 会在相关依赖就绪后再实例化该服务。为了在编写代码时获得完整的类型提示,可以通过模块补充将服务属性声明到 Context 接口:
ts
declare module 'cordis' {
interface Context { greeter: GreeterService }
}消费
插件可以通过声明依赖、按需获取或回调注入等方式消费已有服务:
ts
export const inject = ['greeter'] // 必需
ctx.greeter.hello()
ctx.get('greeter') // 可选 → GreeterService | undefined
ctx.inject(['greeter'], (ctx) => { ... }) // 条件挂载命名
跨包服务的属性名称建议使用 snake_case(例如 ctx.chatluna_providers、ctx.chat_observer)。若涉及跨包共享的 Symbol,应使用 Symbol.for 进行全局注册,避免多包打包时造成引用隔离。