You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
3.1 KiB

// Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved.
package container
import (
"errors"
"fmt"
)
// 服务组件信息
// @Implement LAPP_GAAS_GFrame_BACKEND/container/ComponentInformation
type ServiceInformation struct {
// @Inherit LAPP_GAAS_GFrame_BACKEND/container/ElementInformation
ElementInformation
// 方法信息映射: map[方法名]方法信息
methodMapping map[string]*ServiceMethodInformation
}
// 创建服务组件信息
// 参数
// 1.工厂方法
// 返回值:
// 1.服务组件信息
// 2.错误
func NewServiceInformation(factory interface{}) *ServiceInformation {
valueOfFactory, interfaceType := parseFactory(factory)
return &ServiceInformation{ElementInformation{valueOfFactory, interfaceType}, make(map[string]*ServiceMethodInformation, 10)}
}
// @Reference LAPP_GAAS_GFrame_BACKEND/container/ComponentInformation.BuildHandler
// @Override LAPP_GAAS_GFrame_BACKEND/container/ElementInformation.BuildHandler
func (info *ServiceInformation) BuildHandler(sessionContext *SessionContext) (ComponentHandler, error) {
if sessionContext == nil {
return nil, errors.New(fmt.Sprintf("会话上下文不能为空!"))
}
instance, err := info.factory.Create(sessionContext)
if err != nil {
return nil, err
}
methodHandlers := make(map[string]*ServiceMethodHandler, len(info.methodMapping))
for methodName, methodInformation := range info.methodMapping {
methodHandler, err := methodInformation.BuildHandler(sessionContext, instance)
if err != nil {
return nil, err
}
methodHandlers[methodName] = methodHandler
}
serviceHandler, err := NewServiceHandler(instance, methodHandlers)
if err != nil {
return nil, err
}
return serviceHandler, nil
}
// 注册服务方法
// 参数
// 1.方法
// 返回值:
// 1.注册的服务方法信息
// 2.错误
// 异常
// 1.方法名不能为空
// 2.方法已经注册
// 3.找不到方法
// 4.方法类型不能为空
// 5.返回值数量错误
// 6.最后一个返回值类型错误
func (info *ServiceInformation) RegisterMethod(methodName string) *ServiceMethodInformation {
if methodName == "" {
panic(fmt.Sprintf("方法名不能为空!"))
}
if _, ok := info.methodMapping[methodName]; ok {
panic(fmt.Sprintf("方法%s已经注册!", methodName))
}
method, ok := info.interfaceType.MethodByName(methodName)
if !ok {
panic(fmt.Sprintf("找不到方法%s!", methodName))
}
methodInformation := NewServiceMethodInformation(&method)
info.methodMapping[methodName] = methodInformation
return methodInformation
}
// 获取指定名称的服务方法信息
// 参数:
// 1.方法名
// 返回值:
// 1.方法信息
func (info *ServiceInformation) Method(methodName string) *ServiceMethodInformation {
method, ok := info.methodMapping[methodName]
if ok {
return method
}
return nil
}
// 获取注册的服务方法信息列表
// 返回值:
// 1.服务方法信息列表
func (info *ServiceInformation) Methods() []*ServiceMethodInformation {
methods := make([]*ServiceMethodInformation, len(info.methodMapping))
index := 0
for _, method := range info.methodMapping {
methods[index] = method
index++
}
return methods
}