设为首页 加入收藏

TOP

CQRS简单入门(Golang)(二)
2019-01-29 12:08:37 】 浏览:498
Tags:CQRS 简单 入门 Golang
return nil }

4. infrastructure

  由于是简单入门infrastructure层进行了抽象简化,提供基本的仓储功能。领域层进行业务处理根据所需进行数据的持久化以及读取等。

 

三、简要总结

  一种方法是使其足够简单以至于不存在明显的缺陷,另外一种是使其足够复杂以至于看不出有什么问题。

  以上组合已经能够支持最基础的CQRS/ES的概念和功能了。

  现在看看如何利用已有的东西,对具体业务进行融合。

四、小试牛刀

  支付项目中第三方支付公司需要和客户进行签约。需要调用支付公司的接口将用户提交的基本信息提交给支付公司,支付公司发送验证码并告知用户须知,签约成功之后需要将协约基本信息进行保存,以后使用该协约进行代收付等资金业务。

  单纯演示,将概要设计简化如下:获取客户端提交的用户信息,校验数据,调用第三方支付的接口,持久化到SQLite数据库,激活领域事件存储到MongoDB,领域事件的处理。

1. presentation

  这里偷懒,没有进行API路由和命令的映射,统一使用了"/api/sign_protocol"。核心代码注册API。

    signProtocolAPI := "/api/sign_protocol"
    router.POST(signProtocolAPI, handles(signProtocolAPI))

2. application

         Application层不需要额外代码

3. domain

         domain层只需要commands.go、protocol.go;代码也很简单,command主要两个功能承载入参、承接应用层到聚合根。

func init() {
    eh.RegisterCommand(func() eh.Command { return &SignProtocol{} })
}

const (
    SignCommand eh.CommandType = "/api/sign_protocol"
)

type SignProtocol struct {
    ID uuid.UUID
    //通道号
    AisleType string `json:"AisleType"`
    //银行code,各平台不一样
    BankCode string `json:"BankCode"`
    //账户类型
    AccountType string `json:"AccountType"`
    //账户属性
    AccountProp string `json:"AccountProp"`
    //银行卡号
    BankCardNo string `json:"BankCardNo"`
    //预留手机号
    ReservePhone string `json:"Tel"`
    //银行卡预留的证件类型
    IDCardType string `json:"IDType"`
    //银行卡开户姓名
    CardName string `json:"CardName"`
    //银行卡预留的证件号码
    IDCardNo string `json:"IDCardNo"`
    //提示标识
    Merrem string `json:"Merrem"`
    //备注
    Remark string `json:"Remark"`
}

func (c SignProtocol) AggregateID() uuid.UUID          { return c.ID }
func (c SignProtocol) CommandType() eh.CommandType     { return SignCommand }
func (c SignProtocol) AggregateType() eh.AggregateType { return "" } //Command需要知道具体Aggregate的存在,貌似不甚合理呀!!!

         protocol.go聚合根,主要的业务逻辑。这里也很简单,进行领域服务请求、并且进行持久化。

func init() {
    prdctAgg := &ProtocolAggregate{
        AggregateBase: events.NewAggregateBase("ProtocolAggregate", uuid.New()),
    }
    bus.RegisterHandler(SignCommand, prdctAgg)
}

type ProtocolAggregate struct {
    *events.AggregateBase
}

var _ = eh.Aggregate(&ProtocolAggregate{})

func (a *ProtocolAggregate) HandleCommand(ctx context.Context, cmd eh.Command) error {
    switch cmd := cmd.(type) {
    case *SignProtocol:
        //命令只需要确定输入参数满足业务校验即可
        err := a.CheckSign()
        if err != nil {
            return err
        }
        //实际的业务可以异步进行处理
        go a.CfrmSign(cmd)

        return nil
    }
    return fmt.Errorf("couldn't handle command")
}

func (a *ProtocolAggregate) CheckSign() error {
    //校验输入参数是否有效,
    return nil
}

func (a *ProtocolAggregate) CfrmSign(cmd *SignProtocol) error {

    protocolOrm := &interfaces.ProtocolOrm{
        ProtocolNo:   uuid.New().String(),
        AisleType:    cmd.AisleType,
        BankCode:     cmd.BankCode,
        BankCardNo:   cmd.BankCardNo,
        ReservePhone: cmd.ReservePhone,
        CardName:     cmd.CardName,
        IDCardNo:     cmd.IDCardNo,
        Merrem:       cmd.Merrem,
        Remark:       cmd.Remark,
        Status:       1,
    }
    protocolOrm.AccountType, _ = strconv.Atoi(cmd.AccountType)
    protocolOrm.AccountProp, _ = strconv.Atoi(cmd.AccountProp)
    protocolOrm.IDCardType, _ = strco
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[Go] go get获取官方库被墙解决 下一篇Golint的简易使用方法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目