Axon框架中两个聚合体之间的通信

我是 Axon 框架、CQRS 和 DDD 的新手。我被教导使用关系数据库创建简单的 CRUD 应用程序。因此,我首先专注于构建数据模型,而不是领域模型。我想改变我的软件方法,使其更加务实,并创建现实世界的应用程序。因此,我想使用 CQRS 模式和事件溯源。

我现在正在使用 Spring Boot 和 Axon 框架开发一个库应用程序。基本要求之一是用户已借书。我有两个用于 User 和 Book 的聚合。

这是我的 BookAggregate:

    @Data
    @AllArgsConstructor @NoArgsConstructor
    @Aggregate
    public class BookAggregate {
    
        @AggregateIdentifier
        private UUID id;
        private String name;
        private String isbnNumber;
        private int amountOfCopies;
        private Author author;
        private Genre genre;
        private PublishingHouse publishingHouse;
        
        ...

这是我的 UserAggregate:

    @Data
    @AllArgsConstructor @NoArgsConstructor
    @Aggregate
    public class UserAggregate {
    
        @AggregateIdentifier
        private UUID id;
        private String firstName;
        private String lastName;
        private String email;
        private String password;
        private String confirmPassword;
        private Set<Role> roles;
        private Date birthDate;
        private String telNumber;
        private Address address;
    
        ...

我的问题是:我是否应该在这两个聚合之间创建一个中间聚合,例如 SQL JOIN?在这个例子中,我想看看在 Axon 框架中如何实现两个聚合相互通信的相似用例。

回答

我应该在这两个聚合之间创建一个中间聚合,比如 SQL JOIN?在这个例子中,我想看看在 Axon 框架中如何实现两个聚合相互通信的相似用例。

很好的问题。我先说不,然后试着帮助你理解为什么。

让我们从聚合存在的原因开始。从DDD 参考:

聚合体

在具有复杂关联的模型中,很难保证对象变化的一致性。
[...]

因此:将实体和值对象聚集成聚合体,并在每个聚合体周围定义边界。选择一个实体作为每个聚合的根,并允许外部对象仅保存对根的引用

好的,所以使用聚合的原因是为了避免中介。

由于您正在执行 CQRS(这意味着 DDD 和事件源),您有一个命令端和一个查询端(命令查询请求隔离)。如果您更熟悉 CRUD 风格的应用程序和关系数据库,那么您可能关注的是查询端而不是命令端。

让我们在 CQRS 中澄清一些事情:

  • 聚合仅与命令端相关
  • 聚合负责处理命令和发布事件
  • 聚合负责执行业务规则

这对于命令端来说意味着:命令被传递给聚合,聚合决定是否应该发布事件或拒绝命令。

在查询端:处理源自命令端的事件以构建查询模型(可能是您所说的数据模型)

因此,我首先专注于构建数据模型,而不是领域模型

在事件源系统中,您通常关注领域模型和相关事件。查询模型可以完全基于领域模型中的事件构建。

由于您还没有关注领域模型,因此您还不必关心聚合:)

再次回到你最初的问题:

基本要求之一是用户已借书

我应该在这两个聚合之间创建一个中间聚合,比如 SQL JOIN?

根据您的域,您已经有一个 User 和 Book 聚合。您只有一个要求,即用户可以借书。现在我不是您所在领域的专家,但问问自己:为什么需要另一个聚合?这个新的聚合将负责什么?如果允许用户借书,只让Book.borrow(userId)which 发布BookBorrowed(bookId, userId)事件会有什么问题?


以上是Axon框架中两个聚合体之间的通信的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>