Golang事件溯源代码生成器Goesgen v1.0.0发布

Golang事件溯源代码生成器Goesgen v1.0.0发布 大家好,我刚刚发布了 goesgen v1.0.0 🥳

这是一个用于基于事件溯源、具有强一致性保证的 CQRS 系统的 Go 代码生成器。

一如既往,非常欢迎大家的反馈! 🙂

1 回复

更多关于Golang事件溯源代码生成器Goesgen v1.0.0发布的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


祝贺goesgen v1.0.0发布!这是一个非常实用的工具,能够显著简化基于事件溯源的CQRS系统在Go中的开发流程。通过代码生成来确保强一致性,可以大大减少手动编写样板代码的工作量,同时降低出错风险。

以下是一个简单的示例,展示如何使用goesgen生成的代码来定义聚合根和事件:

// 假设这是由goesgen根据领域定义文件生成的聚合根代码
package user

import (
    "errors"
    "github.com/google/uuid"
)

// User 聚合根
type User struct {
    id        uuid.UUID
    name      string
    email     string
    version   int
    changes   []Event
}

// CreateUser 创建用户的命令处理
func (u *User) CreateUser(cmd CreateUserCommand) error {
    if u.id != uuid.Nil {
        return errors.New("user already exists")
    }
    
    u.apply(&UserCreated{
        ID:    cmd.ID,
        Name:  cmd.Name,
        Email: cmd.Email,
    })
    return nil
}

// ChangeEmail 更改邮箱的命令处理
func (u *User) ChangeEmail(cmd ChangeEmailCommand) error {
    if u.id == uuid.Nil {
        return errors.New("user does not exist")
    }
    
    u.apply(&EmailChanged{
        UserID: u.id,
        NewEmail: cmd.NewEmail,
    })
    return nil
}

// apply 应用事件到聚合根状态
func (u *User) apply(event Event) {
    switch e := event.(type) {
    case *UserCreated:
        u.id = e.ID
        u.name = e.Name
        u.email = e.Email
    case *EmailChanged:
        u.email = e.NewEmail
    }
    u.changes = append(u.changes, event)
    u.version++
}

生成的代码通常包含聚合根、事件、命令、投影等核心组件,开发者可以专注于业务逻辑的实现,而不必担心事件溯源的基础设施代码。这种代码生成方式特别适合需要严格保证事件顺序和一致性的系统。

回到顶部