CQRS如何避免重复命令和事件之间的字段?

c4k*_*c4k 4 java cqrs event-sourcing

我正在使用CQRS和Event Sourcing实施一个项目.我意识到我的命令和我的事件几乎总是一样的.

假设我有一个命令CreatePost:

public class CreatePost implements Command {
    private final String title;
    private final String content;
}
Run Code Online (Sandbox Code Playgroud)

从此命令触发的事件是相同的:

public class PostCreated implements Event {
    private final String title;
    private final String content;
}
Run Code Online (Sandbox Code Playgroud)

你如何处理你的应用程序?

编辑:当然我知道基本的OOP技术.我可以创建具有公共字段的抽象,但是这个问题需要在CQRS/ES上下文中进行.

Voi*_*son 6

如何避免在命令和事件之间重复字段?

我不会 - 直到我绝对不能忍受它.

从根本上说,命令和事件不是对象,它们是消息 - 跨越边界的状态表示.我认为你的记忆表现不要忽视这一点很重要.

消息模式的一个特征是它们随着时间的推移而发展,因此您需要了解兼容性.这里是踢球者:事件和命令在不同的时间尺度上发展.

命令消息是域模型与其他进程通信的方式; API部分的更改由公开/弃用功能驱动.

但是在事件源世界中,事件是从先前版本的域到当前版本的消息.它们是我们部署新模型所需支持的一部分,这些模型可以从旧模型中断的地方恢复工作.

所以我会让命令和事件彼此分开 - 它们是不同的东西.

如果你在字段中看到很多重复,那么可能暗示有一些你还没有明确表达的值类型.

CreatePost 
    { Post 
        { Title
        , Contents
        }
    }

PostCreated
    { Post 
        { Title
        , Contents
        }
    }
Run Code Online (Sandbox Code Playgroud)