对golang项目骨架事件的修改

166 阅读1分钟

先来看在上一篇文章中事件的使用方法,这里只看事件的监听:

 package listen
  
  import (
  	"fmt"
  	event2 "skeleton/app/event/entity"
  	"skeleton/internal/event"
  )
  
  type DemoEventListen struct {
  }
  
  func (*DemoEventListen) Listen() event.EventInterface {
  	return &event2.DemoEvent{}
  }
  
  func (*DemoEventListen) Process(data any) (any, error) {
  	return fmt.Sprintf("%v --> %s", data, "exec DemoEventListen.Process"), nil
  }

Listen() event.EventInterface函数只返回一个事件,也就是这个监听器只和DemoEvent这一个事件绑定了。

但是如果业务中,需要在某些事件发生时同时处理多个逻辑,例如事件发生时,需要 记录日志、发送邮件、处理请求等。

然后骨架里面就对event做了如下修改:

  • 定义事件实体(事件定义没有过多的修改,相较于之前只删除了定义事件名称函数EventName() string

    app/event/entity目录下定义一个事件实体,该实体实现了event.EventInterface接口:

    package entity
    
    type DemoEvent1 struct {}
    
    func (d *DemoEvent1) GetData() any {
        return "DemoEvent1 param"
    }
    
    type DemoEvent2 struct {}
    
    func (d *DemoEvent2) GetData() any {
        return "DemoEvent2 param"
    }
    
  • 定义事件监听

    app/event/listen目录中定义一个DemoEventListen事件监听,并且该DemoEventListen结构体必须要实现event.Interface接口:

    package listen
    
    import (
    	"fmt"
    	event2 "skeleton/app/event/entity"
    	"skeleton/internal/event"
    )
    
    type DemoEventListen struct {
    }
    
    func (*DemoEventListen) Listen() []event.EventInterface {
    	return []event.EventInterface{
              &event2.DemoEvent1{},
              &event2.DemoEvent2{}
          }
    }
    
    func (*DemoEventListen) Process(data any) {
    	fmt.Printf("%v --> %s", data, "exec DemoEventListen.Process")
    }
    

    Listen()函数的返回值改成了事件切片[]event.EventInterface

    Process(data any)函数取消了返回值

  • 最后需要将事件进行注册,在app/event/event.go文件中的Init方法内执行:

    variable.Event.Register(&listen.DemoEventListen{})
    
  • 调用事件执行

    // 同步
    variable.Event.Dispatch(&entity.DemoEvent{})
    
    // 异步
    variable.Event.DispatchAsync(&entity.DemoEvent{})
    

    事件的调用,增加了异步方法DispatchAsync(event EventInterface) error

骨架仓库地址如下:

github地址:https://github.com/czx-lab/skeleton

gitee地址:https://gitee.com/neddie/skeleton