package user_ev import ( "hilo-user/_const" "hilo-user/domain" "hilo-user/domain/event" "hilo-user/resource/mysql" ) //注册监听 var userEditEvent = new(event.Base) /** 注册事件 */ type GameEditEvent struct { GameId mysql.ID `json:"userId"` // 游戏id TxGroupId mysql.Str `json:"txGroupId"` // 群组id } //添加领域事件,在每个领域模型中init中添加,因为这是静态业务,非动态的。 func AddGameEditEventSync(callback func(model *domain.Model, event interface{}) error) { userEditEvent.SyncList = append(userEditEvent.SyncList, callback) } //加入到异步操作中 func AddGameEditEventAsync(callback func(model *domain.Model, event interface{}) error) { userEditEvent.AsyncList = append(userEditEvent.AsyncList, callback) } //领域事件发布 func PublishGameEditEvent(model *domain.Model, event interface{}) error { //执行同步的领域事件 for _, callback := range userEditEvent.SyncList { if err := callback(model, event); err != nil { return err } } // 执行异步的领域事件 if len(userEditEvent.AsyncList) > 0 { go func() { defer _const.CheckGoPanic() for _, callback := range userEditEvent.AsyncList { // 异步事件需要用新model,主要是db var newModel = domain.CreateModelContext(model.MyContext) if err := callback(newModel, event); err != nil { model.Log.Errorf("userEditEvent aysnc fail:%v", err) } } }() } return nil }