// Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved. package rpc import ( "LAPP_LF_MOM_BACKEND/container" "fmt" "github.com/kataras/iris/v12/core/router" "reflect" "strings" ) type ServiceRouteManager struct { componentContainer container.ComponentContainer serviceType reflect.Type alias string routeFactories map[string]func(router.Party, string, reflect.Type, func([]reflect.Value) []reflect.Value) error } func NewServiceRouteManager(componentContainer container.ComponentContainer, serviceType reflect.Type) *ServiceRouteManager { return &ServiceRouteManager{componentContainer, serviceType, "", make(map[string]func(router.Party, string, reflect.Type, func([]reflect.Value) []reflect.Value) error, 10)} } func (manager *ServiceRouteManager) SetAlias(value string) *ServiceRouteManager { manager.alias = value return manager } func (manager *ServiceRouteManager) RegisterRoute(methodName string, routeFactory func(router.Party, string, reflect.Type, func([]reflect.Value) []reflect.Value) error) *ServiceRouteManager { manager.routeFactories[methodName] = routeFactory return manager } func (manager *ServiceRouteManager) BindRoutes(pathMapping map[string][]string, party router.Party) { packageList := strings.Split(manager.serviceType.PkgPath(), container.PathSeparator) servicePackagePath := "" for index, packageName := range packageList { if strings.ToLower(packageName) == container.ServicesPackageName { servicePackagePath = strings.Join(packageList[index+1:], container.PathSeparator) break } } serviceTypeName := manager.serviceType.Name() serviceName := "" if manager.alias != "" { serviceName = manager.alias } else { serviceName = serviceTypeName[:len(serviceTypeName)-len(container.ServiceNameSuffix)] } servicePath := strings.ToLower(fmt.Sprintf("/%s/%s", servicePackagePath, serviceName)) group, ok := pathMapping[servicePath] if !ok { group = make([]string, 0, 10) } pathMapping[servicePath] = append(group, serviceName) for i := 0; i < manager.serviceType.NumMethod(); i++ { method := manager.serviceType.Method(i) methodFullName := fmt.Sprintf("%s/%s.%s", servicePackagePath, serviceTypeName, method.Name) caller := manager.componentContainer.GetServiceCaller(methodFullName) if caller == nil { panic(fmt.Sprintf("没有找到Caller : %s !", methodFullName)) } routeFactory, ok := manager.routeFactories[method.Name] if ok { err := routeFactory(party, strings.ToLower(fmt.Sprintf("/%s/%s", servicePath, method.Name)), method.Type, caller) if err != nil { panic(err.Error()) } } } }