反射 (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
服务名称
声明当前上下文提供的服务。