1.8 服务方法管理器
服务方法管理器
在上面介绍上下文对象时,我们提到在服务端上下文对象(ServiceContext
)包含有一个服务方法(method
)属性。该属性对应服务端发布的服务方法,该属性的类型在不同语言中的定义会有所不同,它其中包含了关于服务方法的一些必要信息,比如发布名称(区别于方法定义的名称),方法本体(可以反射调用或直接调用的方法对象),方法所属对象,参数类型,是否是通用方法,参数中是否包含有上下文对象等等。服务方法(Method
)上还可以包含用户自定义的数据,在用户自定义插件时,可以根据这些用户自定义的数据来针对特定的方法进行一些特殊的操作。
服务方法(Method
)由服务方法管理器(MethodManager
)来统一管理,服务方法管理器包含以下一些必须的方法:
getNames
add
get
remove
addMissingMethod
每种语言在实现时,这些方法在命名上可能会有大小写上的区别。
其中 getNames
方法返回所有已发布的方法名列表,该方法本身也会作为一个特殊的服务方法被发布,为了避免跟用户发布的方法有命名冲突,在发布时,该方法是以特殊字符 ~
来作为发布名称来发布的。
add
方法用来添加发布的服务方法。该方法在不同的语言中,可以根据具体情况提供多个重载或不同命名的多个实现,例如:addMethod
,addMethods
,addFunction
,addFunctions
,addStaticMethods
,addInstanceMethods
等等。
get
方法用来通过发布名称获取已发布的服务方法对象。在某些语言中(比如 C#),允许发布相同名称但参数个数不同的重载方法,因此,在这些语言中,get
方法本身会有 2 个参数(发布名称,参数个数)。
remove
方法用来删除已发布的服务方法。该方法的参数与 get
方法相同。
addMissingMethod
方法用来添加一个通用的服务方法,当客户端调用的服务方法不存在时,该服务方法才会被调用。该方法的名称在服务方法管理器中,以一个特殊字符 *
来表示,客户端不应直接调用此方法。
当调用 get
方法时,如果查找的具体服务方法不存在,但是通用服务方法存在的话,则会返回通用服务方法,否则返回 null
。
用户通常不需要直接使用服务方法管理器(MethodManager
),因为在服务端 Service
类型中它是作为一个内部属性出现的,它所包含的方法也是由 Service
类型对象所暴露的。
但是当开发插件时,如果需要用到服务发布管理的功能,用户可以在插件中使用服务方法管理器(MethodManager
),例如在反向调用插件的实现中,就使用了服务方法管理器(MethodManager
)。