专栏首页码匠的流水账聊聊go.cqrs的EventHandler

聊聊go.cqrs的EventHandler

本文主要研究一下go.cqrs的EventHandler

EventHandler

type EventHandler interface {
    Handle(EventMessage)
}

EventHandler定义了Handle方法

EventMessage

// EventMessage is the interface that a command must implement.
type EventMessage interface {

    // AggregateID returns the ID of the Aggregate that the event relates to
    AggregateID() string

    // GetHeaders returns the key value collection of headers for the event.
    //
    // Headers are metadata about the event that do not form part of the
    // actual event but are still required to be persisted alongside the event.
    GetHeaders() map[string]interface{}

    // SetHeader sets the value of the header specified by the key
    SetHeader(string, interface{})

    // Returns the actual event which is the payload of the event message.
    Event() interface{}

    // EventType returns a string descriptor of the command name
    EventType() string

    // Version returns the version of the event
    Version() *int
}

EventMessage接口定义了AggregateID、GetHeaders、SetHeader、Event、EventType、Version方法

EventDescriptor

// EventDescriptor is an implementation of the event message interface.
type EventDescriptor struct {
    id      string
    event   interface{}
    headers map[string]interface{}
    version *int
}

// NewEventMessage returns a new event descriptor
func NewEventMessage(aggregateID string, event interface{}, version *int) *EventDescriptor {
    return &EventDescriptor{
        id:      aggregateID,
        event:   event,
        headers: make(map[string]interface{}),
        version: version,
    }
}

// EventType returns the name of the event type as a string.
func (c *EventDescriptor) EventType() string {
    return typeOf(c.event)
}

// AggregateID returns the ID of the Aggregate that the event relates to.
func (c *EventDescriptor) AggregateID() string {
    return c.id
}

// GetHeaders returns the headers for the event.
func (c *EventDescriptor) GetHeaders() map[string]interface{} {
    return c.headers
}

// SetHeader sets the value of the header specified by the key
func (c *EventDescriptor) SetHeader(key string, value interface{}) {
    c.headers[key] = value
}

// Event the event payload of the event message
func (c *EventDescriptor) Event() interface{} {
    return c.event
}

// Version returns the version of the event
func (c *EventDescriptor) Version() *int {
    return c.version
}

EventDescriptor定义了id、event、headers、version属性,它实现了EventMessage接口

PublishEvent

// PublishEvent publishes events to all registered event handlers
func (b *InternalEventBus) PublishEvent(event EventMessage) {
    if handlers, ok := b.eventHandlers[event.EventType()]; ok {
        for handler := range handlers {
            handler.Handle(event)
        }
    }
}

InternalEventBus的PublishEvent方法会遍历指定event.EventType()的handlers,挨个执行handler.Handle(event)方法

小结

go.cqrs的EventHandler定义了Handle方法;InternalEventBus的PublishEvent方法会遍历指定event.EventType()的handlers,挨个执行handler.Handle(event)方法。

doc

  • go.cqrs

本文分享自微信公众号 - 码匠的流水账(geek_luandun),作者:码匠乱炖

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-04-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊go.cqrs的EventHandler

    go.cqrs的EventHandler定义了Handle方法;InternalEventBus的PublishEvent方法会遍历指定event.EventT...

    codecraft
  • 聊聊go.cqrs的AggregateRoot

    go.cqrs的AggregateRoot接口定义了AggregateID、OriginalVersion、CurrentVersion、IncrementVe...

    codecraft
  • 聊聊go.cqrs的DomainRepository

    go.cqrs的DomainRepository定义了Load、Save方法;GetEventStoreCommonDomainRepo实现了DomainRep...

    codecraft
  • 聊聊go.cqrs的Dispatcher

    go.cqrs的Dispatcher接口定义了Dispatch、RegisterHandler方法;InMemoryDispatcher定义了map[strin...

    codecraft
  • 聊聊go.cqrs的AggregateRoot

    go.cqrs的AggregateRoot接口定义了AggregateID、OriginalVersion、CurrentVersion、IncrementVe...

    codecraft
  • 聊聊go.cqrs的Dispatcher

    go.cqrs的Dispatcher接口定义了Dispatch、RegisterHandler方法;InMemoryDispatcher定义了map[strin...

    codecraft
  • 聊聊go.cqrs的DomainRepository

    go.cqrs的DomainRepository定义了Load、Save方法;GetEventStoreCommonDomainRepo实现了DomainRep...

    codecraft
  • 零基础搭建iOS语音聊天室平台源码

    语音聊天室平台源码的实现,主要由业务系统和移动/Web 客户端组成。其中业务系统需要实现房间管理、麦位管理、音频流和麦位关联关系管理等功能,客户端需要实现登录/...

    云豹科技程序员
  • 基于sliverlight + wcf的web 文字版IM 示例

    演示地址: http://task.24city.com/default.html 预览界面: ? 一、布局 采用Grid布局,5行2列 第一行:为登录/注册信...

    菩提树下的杨过
  • JavaScript 设计模式学习第十八篇-发布-订阅模式

    在众多设计模式中,可能最常见、最有名的就是发布 - 订阅模式了,本篇我们一起来学习这个模式。

    越陌度阡
  • 浏览器 DOM 元素的事件代理指的是什么

    在网页中,如果想与使用者进行“互动”,必须要通过某种方法知道他都做了什么。当然,浏览器开发者们早已根据 W3C 事件规范[1]实现好了底层的逻辑,我们只需要通过...

    疯狂的技术宅
  • 微信公众平台开发教程(四) 实例入门:机器人(附源码)

    上一篇文章,写了基本框架,可能很多人会觉得晕头转向,这里提供一个简单的例子来予以说明,希望能帮你解开谜团。

    Java架构师必看
  • C# dotnet 使用 TaskCompletionSource 让事件转异步方法

    咱今天来聊聊一个毁灭世界的故事,哦,不,是一个使用 TaskCompletionSource 让偷核武器,哦,又说错了,是让事件转换为异步的方法,让咱可以在一个...

    林德熙
  • 2018-12-13-不要相信那些事件引发者

    最近发现C#的事件和wpf的dispatcherobject在一起使用会有一些不容易发觉的问题。

    黄腾霄
  • 白板类应用的业务事件分发模式

    在画板上延伸业务的事件,可以通过画板本身,利用路由事件分发,此时能解决依赖事件业务对具体业务对象的依赖

    林德熙
  • 聊聊flink的TimeCharacteristic

    flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/Time...

    codecraft
  • 聊聊flink的SourceFunction

    flink-streaming-java_2.11-1.6.2-sources.jar!/org/apache/flink/streaming/api/func...

    codecraft
  • 聊聊flink的CsvReader

    flink-java-1.6.2-sources.jar!/org/apache/flink/api/java/ExecutionEnvironment.jav...

    codecraft
  • 聊聊flink的BoltWrapper

    flink-storm_2.11-1.6.2-sources.jar!/org/apache/flink/storm/wrappers/BoltWrapper....

    codecraft

扫码关注云+社区

领取腾讯云代金券