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

聊聊go.cqrs的Dispatcher

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

Dispatcher

type Dispatcher interface {
    Dispatch(CommandMessage) error
    RegisterHandler(CommandHandler, ...interface{}) error
}

Dispatcher接口定义了Dispatch、RegisterHandler方法

InMemoryDispatcher

type InMemoryDispatcher struct {
    handlers map[string]CommandHandler
}

//NewInMemoryDispatcher constructs a new in memory dispatcher
func NewInMemoryDispatcher() *InMemoryDispatcher {
    b := &InMemoryDispatcher{
        handlers: make(map[string]CommandHandler),
    }
    return b
}

//Dispatch passes the CommandMessage on to all registered command handlers.
func (b *InMemoryDispatcher) Dispatch(command CommandMessage) error {
    if handler, ok := b.handlers[command.CommandType()]; ok {
        return handler.Handle(command)
    }
    return fmt.Errorf("The command bus does not have a handler for commands of type: %s", command.CommandType())
}

//RegisterHandler registers a command handler for the command types specified by the
//variadic commands parameter.
func (b *InMemoryDispatcher) RegisterHandler(handler CommandHandler, commands ...interface{}) error {
    for _, command := range commands {
        typeName := typeOf(command)
        if _, ok := b.handlers[typeName]; ok {
            return fmt.Errorf("Duplicate command handler registration with command bus for command of type: %s", typeName)
        }
        b.handlers[typeName] = handler
    }
    return nil
}

InMemoryDispatcher定义了map[string]CommandHandler属性,其Dispatch方法根据command.CommandType()获取handler,然后执行handler.Handle(command);其RegisterHandler方法遍历commands,然后获取command的type,挨个注册到map[string]CommandHandler中

CommandHandler

// CommandHandler is the interface that all command handlers should implement.
type CommandHandler interface {
    Handle(CommandMessage) error
}

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

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

    // Headers returns the key value collection of headers for the command.
    Headers() map[string]interface{}

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

    // Command returns the actual command which is the payload of the command message.
    Command() interface{}

    // CommandType returns a string descriptor of the command name
    CommandType() string
}

CommandHandler接口定义了Handle方法;CommandMessage接口定义了AggregateID、Headers、SetHeader、Command、CommandType方法

小结

go.cqrs的Dispatcher接口定义了Dispatch、RegisterHandler方法;InMemoryDispatcher定义了map[string]CommandHandler属性,其Dispatch方法根据command.CommandType()获取handler,然后执行handler.Handle(command);其RegisterHandler方法遍历commands,然后获取command的type,挨个注册到map[string]CommandHandler中。

doc

  • go.cqrs

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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊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的DomainRepository

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

    codecraft
  • 聊聊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的EventHandler

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

    codecraft
  • 聊聊go.cqrs的DomainRepository

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

    codecraft
  • 聊聊puma的Dispatcher

    puma/puma/src/main/java/com/dianping/puma/sender/dispatcher/Dispatcher.java

    codecraft
  • 聊聊puma的Dispatcher

    puma/puma/src/main/java/com/dianping/puma/sender/dispatcher/Dispatcher.java

    codecraft
  • 虚拟茶话会(1):初次实现

    在这个项目中,我们将做些正式的网络编程工作:编写一个聊天服务器,让人们能够通过网络实时地聊天。使用Python创建这种程序的方式有很多,一种简单而自然的方法是使...

    不可言诉的深渊
  • 基于消息总线的高可扩展性IM系统后台架构设计

    如果你还不了解IM系统的整体结构,可以先看看《一个海量在线用户即时通讯系统(IM)的完整设计》(一下简称《IM完整设计》)这篇文章。

    普通程序员
  • 虚拟茶话会(2):再次实现

    第一个原型虽然是个管用的聊天服务器,但其功能很有限,最明显的缺陷是没法知道每句话都是谁说的。另外,它也不能解释命令(如say或logout),而最初的规范要求提...

    不可言诉的深渊
  • Python RPC 不会?不妨看看这篇文章

    RPC,全程为 Remote Procedure Call,是一种进程间的通信方式,它采用「 服务端 / 客户机 」模式,是一种请求响应模型

    AirPython
  • 浅谈前端状态管理

    近两年前端技术的发展如火如荼,大量的前端项目都在使用或转向 Vue 和 React 的阵营,由前端渲染页面的单页应用占比也越来越高,这就代表前端工作的复杂度也在...

    疯狂的技术宅
  • Nodejs学习笔记(十六)--- Pomelo介绍&入门

    前言&介绍 Pomelo:一个快速、可扩展、Node.js分布式游戏服务器框架 从三四年前接触Node.js开始就接触到了Pomelo,从Pomelo最...

    Porschev
  • jdk下httpserver源码解析

      所以今天就由我来为大家解析一下httpserver的源码。(这里我会去掉其中的https部分的源码,只讲http部分,对httpserver中https的实...

    不会飞的小鸟
  • 上半年面试(扑街)经验总结 | 掘金技术征文

    今年面试我的看法就是真的好难啊。要准备基础还要刷算法题,不仅问安卓,还要问jvm虚拟机,顺便问问并发,还要会kotlin,最好还能来个flutter,给各位跪了...

    逮虾户
  • python项目练习五:虚拟茶话会

    几乎在学习、使用任何一种编程语言的时候,关于socket的练习从来都不会少,尤其是会写一些局域网的通信的东西。所以书上的这个项目刚好可以练习一下socket编程...

    the5fire
  • Python权威指南的10个项目(1~5

    引言:   我相信学习Python过的朋友,一定会喜欢上这门语言,简单,库多,易上手,学习成本低,但是如果是学习之后,不经常使用,或者工作中暂时用不到,那么不久...

    py3study

扫码关注云+社区

领取腾讯云代金券