Skip to content

服务 (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 进行全局注册,避免多包打包时造成引用隔离。

继续 ​

页面历史

在 CC-BY-SA-4.0 许可下发布