dispatch.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package admin
  2. import (
  3. "errors"
  4. "fmt"
  5. "strings"
  6. )
  7. // 调度器接口
  8. type Dispatch interface {
  9. // 调度器标识
  10. Key() string
  11. // 调度器名称
  12. Name() string
  13. // 调度器描述
  14. Description() string
  15. // 请求调度方法
  16. Call(*Context) (interface{}, error)
  17. }
  18. var dispatchers = make(map[string]Dispatch)
  19. func RegisterDispatch(dispatcher Dispatch) {
  20. dispatchers[strings.ToLower(dispatcher.Key())] = dispatcher
  21. }
  22. func GetDispatcher(type_ string) (Dispatch, error) {
  23. type_ = strings.ToLower(type_)
  24. dispatcher, is := dispatchers[type_]
  25. if !is {
  26. return nil, errors.New(fmt.Sprintf("未找到请求类型(%s)对应的调度程序", type_))
  27. }
  28. return dispatcher, nil
  29. }
  30. func AllDispatcher() map[string]Dispatch {
  31. return dispatchers
  32. }
  33. func AllDispatcherLength() int {
  34. return len(dispatchers)
  35. }
  36. // 默认调度器
  37. type defaultDispatcher struct {
  38. HandleMethod map[string]DefaultDispatcherHandleMethod
  39. }
  40. func (d *defaultDispatcher) Key() string {
  41. return "default"
  42. }
  43. func (d *defaultDispatcher) Name() string {
  44. return "默认"
  45. }
  46. func (d *defaultDispatcher) Description() string {
  47. return "Cadmin系统内置的默认请求调度器"
  48. }
  49. func (d *defaultDispatcher) Call(c *Context) (interface{}, error) {
  50. method, is := d.HandleMethod[c.Request.Call]
  51. if !is {
  52. return nil, errors.New(fmt.Sprintf("[%s 未注册对应的处理方法]", c.Request.Action))
  53. }
  54. r, err := method(c)
  55. if err != nil {
  56. return nil, err
  57. }
  58. return r, nil
  59. }
  60. func (d *defaultDispatcher) Register(methods map[string]DefaultDispatcherHandleMethod) {
  61. for name, method := range methods {
  62. if _, is := d.HandleMethod[name]; is {
  63. panic("[%s] 对应的处理方法已经存在")
  64. }
  65. d.HandleMethod[name] = method
  66. }
  67. }
  68. type DefaultDispatcherHandleMethod func(*Context) (interface{}, error)
  69. var DefaultDispatcher = &defaultDispatcher{HandleMethod: make(map[string]DefaultDispatcherHandleMethod)}
  70. // 注册默认调度器请求处理方法
  71. func RegisterDefaultDispatcherHandleMethod(methods map[string]DefaultDispatcherHandleMethod) {
  72. DefaultDispatcher.Register(methods)
  73. }
  74. func init() {
  75. RegisterDispatch(DefaultDispatcher)
  76. }