广汽安道拓Acura项目MES后台
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.

72 lines
2.6 KiB

  1. // Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved.
  2. package rpc
  3. import (
  4. "LAPP_ACURA_MOM_BACKEND/container"
  5. "fmt"
  6. "github.com/kataras/iris/v12/core/router"
  7. "reflect"
  8. "strings"
  9. )
  10. type ServiceRouteManager struct {
  11. componentContainer container.ComponentContainer
  12. serviceType reflect.Type
  13. alias string
  14. routeFactories map[string]func(router.Party, string, reflect.Type, func([]reflect.Value) []reflect.Value) error
  15. }
  16. func NewServiceRouteManager(componentContainer container.ComponentContainer, serviceType reflect.Type) *ServiceRouteManager {
  17. return &ServiceRouteManager{componentContainer, serviceType, "", make(map[string]func(router.Party, string, reflect.Type, func([]reflect.Value) []reflect.Value) error, 10)}
  18. }
  19. func (manager *ServiceRouteManager) SetAlias(value string) *ServiceRouteManager {
  20. manager.alias = value
  21. return manager
  22. }
  23. func (manager *ServiceRouteManager) RegisterRoute(methodName string, routeFactory func(router.Party, string, reflect.Type, func([]reflect.Value) []reflect.Value) error) *ServiceRouteManager {
  24. manager.routeFactories[methodName] = routeFactory
  25. return manager
  26. }
  27. func (manager *ServiceRouteManager) BindRoutes(pathMapping map[string][]string, party router.Party) {
  28. packageList := strings.Split(manager.serviceType.PkgPath(), container.PathSeparator)
  29. servicePackagePath := ""
  30. for index, packageName := range packageList {
  31. if strings.ToLower(packageName) == container.ServicesPackageName {
  32. servicePackagePath = strings.Join(packageList[index+1:], container.PathSeparator)
  33. break
  34. }
  35. }
  36. serviceTypeName := manager.serviceType.Name()
  37. serviceName := ""
  38. if manager.alias != "" {
  39. serviceName = manager.alias
  40. } else {
  41. serviceName = serviceTypeName[:len(serviceTypeName)-len(container.ServiceNameSuffix)]
  42. }
  43. servicePath := strings.ToLower(fmt.Sprintf("/%s/%s", servicePackagePath, serviceName))
  44. group, ok := pathMapping[servicePath]
  45. if !ok {
  46. group = make([]string, 0, 10)
  47. }
  48. pathMapping[servicePath] = append(group, serviceName)
  49. for i := 0; i < manager.serviceType.NumMethod(); i++ {
  50. method := manager.serviceType.Method(i)
  51. methodFullName := fmt.Sprintf("%s/%s.%s", servicePackagePath, serviceTypeName, method.Name)
  52. caller := manager.componentContainer.GetServiceCaller(methodFullName)
  53. if caller == nil {
  54. panic(fmt.Sprintf("没有找到Caller : %s !", methodFullName))
  55. }
  56. routeFactory, ok := manager.routeFactories[method.Name]
  57. if ok {
  58. err := routeFactory(party, strings.ToLower(fmt.Sprintf("/%s/%s", servicePath, method.Name)), method.Type, caller)
  59. if err != nil {
  60. panic(err.Error())
  61. }
  62. }
  63. }
  64. }