# 事件

目前事件的处理在全局维护了一个事件管理对象,用来管理事件的分发。目前不支持动态的增删。

# 定义一个事件

定义一个事件需要实现以下接口,在使用事件的时候可以传递不同的数据供监听者使用

type Event interface {
	GetEventName() string //返回事件的名称
}
1
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

# 定义一个监听者

监听者只复制监听某一个或多个事件。

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

# 注册事件

注册事件是在框架启动之前注册的,具体注册未知为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

# 触发事件

使用global.GetEventDispatcher(c),来获取事件分发器,其中c 为*gin.Context

global.GetEventDispatcher(c).Dispatch(event.NewLoginEvent("login", u.AdminUserModel))
1