# 事件
目前事件的处理在全局维护了一个事件管理对象,用来管理事件的分发。目前不支持动态的增删。
# 定义一个事件
定义一个事件需要实现以下接口,在使用事件的时候可以传递不同的数据供监听者使用
type Event interface {
GetEventName() string //返回事件的名称
}
1
2
3
2
3
如一下代码
package event
type TestEvent struct {
Name string
}
func NewTestEvent(name string) *TestEvent {
return &TestEvent{Name: name}
}
func (t TestEvent) GetEventName() string {
return "testEvent"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 定义一个监听者
监听者只复制监听某一个或多个事件。
package listener
import (
"fmt"
event2 "ginedu2/service/app/event"
"ginedu2/service/src"
)
type TestListener struct {
}
func NewTestListener() *TestListener {
return &TestListener{}
}
func (t *TestListener) Process(event src.Event) {
switch ev := event.(type) {
case *event2.LoginEvent:
//如果是登陆事件,需要处理的业务
fmt.Println(ev.Name)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 注册事件
注册事件是在框架启动之前注册的,具体注册未知为app/bootstrap.go的InitEvent 函数里
//初始化事件
func InitEvent() *src.EventDispatcher {
EventDispatcher := src.NewDispatcher()
EventDispatcher.Register(event.TestEvent{}.GetEventName(), listener.NewTestListener()) //#注册事件
EventDispatcher.Register(event.LoginEvent{}.GetEventName(), listener.NewTestListener())//#注册事件
return EventDispatcher
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 触发事件
使用global.GetEventDispatcher(c),来获取事件分发器,其中c 为*gin.Context
global.GetEventDispatcher(c).Dispatch(event.NewLoginEvent("login", u.AdminUserModel))
1