Skip to content

反射 (Reflect)

ctx.reflect 是内置服务,提供了与上下文反射相关的 API。

访问规则

插件可以通过服务等方式扩展上下文上的属性。当在某个上下文中访问属性时,Cordis 会根据以下规则进行检查:

  • ctx[prop]

    • 如果 prop 是 symbol,无追踪地返回 ctx 上的对应属性;
    • 如果 prop 满足以下情况,带追踪地返回 ctx 上的对应属性:
      • prop 是内置服务,如 events, reflect, registry
      • prop 是被保留的特殊属性,如 prototype, then
      • prop 是通过 ctx.extend() 定义的属性,如 scope
      • prop$_ 开头;实验性
    • 如果 ctx 处于根作用域内,带追踪地返回 ctx 上的对应属性;实验性
    • 如果 prop 是访问器:实验性
      • 检查提供此访问器的服务是否可读;
      • 执行访问器的 get 方法并返回;
    • 如果 prop 是服务,从当前 ctx.scope 起依次向上级检查所有的作用域:
      • 如果某级作用域可选地 inject 了此服务,带追踪地返回此服务;
      • 如果某级作用域必须地 inject 了此服务:
        • 如果此作用域处于活跃状态,带追踪地返回此作用域缓存的服务;
        • 否则拒绝访问,抛出错误;
      • 如果某级作用域 provide 了此服务,带追踪地返回此服务;
      • 如果某级作用域的上下文和当前上下文就服务 prop 处于不同的隔离域中:
        • 停止向上检查,拒绝访问,抛出错误;
    • 其他情况下,拒绝访问,抛出错误。
  • ctx[prop] = ?

    • 如果 prop 是 symbol,设置 ctx 上的对应属性;
    • 如果 ctx 是根上下文,设置 ctx 上的对应属性;
    • 如果 prop 是访问器:实验性
      • 检查提供此访问器的服务是否可读;
      • 执行访问器的 set 方法并返回;
    • 如果 prop 是服务,从当前 ctx.scope 起依次向上级检查所有的作用域:
      • 如果某级作用域 provide 了此服务,设置此服务;
      • 如果某级作用域的上下文和当前上下文就服务 prop 处于不同的隔离域中:
        • 停止向上检查,拒绝访问,抛出错误;
    • 其他情况下,拒绝访问,抛出错误。
  • prop in ctx

    • 如果 ctx 存在 prop 属性,返回 true
    • 如果 prop 在任何作用域被定义为服务或访问器,返回 true (无论是否被实现);
    • 其他情况下,返回 false

上述规则仅针对对 ctx 的直接访问。可以通过下面介绍的 API 来绕开这些规则。

实例方法

ctx.get(name)

WARNING

请注意与 ctx.http.get()ctx.server.get() 相区分。

  • name: string 服务名称
  • 返回值: any 服务实例

跳过检查获取特定服务。

ctx.set(name, value) 实验性

  • name: string 服务名称
  • value: any 服务实例

跳过检查设置特定服务。

ctx.provide(name) 实验性

  • name: string 服务名称

声明当前上下文提供的服务。