Spring boot 轴突框架中两个聚合体之间的通信
我不熟悉Axon框架、CQRS和DDD。我被教导使用关系数据库创建简单的CRUD应用程序。因此,我首先关注的是构建数据模型,而不是域模型。 我想改变我对软件的态度,以更务实的方式创建真实世界的应用程序。因此,我想使用CQRS模式和事件源 我现在正在使用SpringBoot和Axon框架开发一个库应用程序。其中一个基本要求是用户已经借阅了这本书。我有两个聚合用户和书籍 这是我的书:Spring boot 轴突框架中两个聚合体之间的通信,spring-boot,domain-driven-design,cqrs,axon,Spring Boot,Domain Driven Design,Cqrs,Axon,我不熟悉Axon框架、CQRS和DDD。我被教导使用关系数据库创建简单的CRUD应用程序。因此,我首先关注的是构建数据模型,而不是域模型。 我想改变我对软件的态度,以更务实的方式创建真实世界的应用程序。因此,我想使用CQRS模式和事件源 我现在正在使用SpringBoot和Axon框架开发一个库应用程序。其中一个基本要求是用户已经借阅了这本书。我有两个聚合用户和书籍 这是我的书: @数据 @AllArgsConstructor@NoArgsConstructor @聚合 公共类图书总量{ @聚合
@数据
@AllArgsConstructor@NoArgsConstructor
@聚合
公共类图书总量{
@聚合标识符
私有UUID;
私有字符串名称;
私有字符串isbnNumber;
私人国际货币基金组织;
私人作者;
私人体裁;
私人出版社;
...
这是我的用户聚合:
@数据
@AllArgsConstructor@NoArgsConstructor
@聚合
公共类用户聚合{
@聚合标识符
私有UUID;
私有字符串名;
私有字符串lastName;
私人字符串电子邮件;
私有字符串密码;
私有字符串确认密码;
私人设定角色;
私人生日;
专用字符串电话号码;
私人地址;
...
我的问题是:我是否应该在这两个聚合之间创建一个中间聚合,比如SQLJOIN?在这个示例中,我想看看在Axon框架中如何实现两个聚合相互通信的类似用例
我应该在这两个聚合之间创建一个中间聚合吗
类似SQLJoin的东西?在这个例子中,我想看看如何
两个聚合相互通信的类似用例是
在Axon框架中实现
好问题。我先说不,然后试着帮你理解为什么
让我们从聚合存在的原因开始。从:
聚集体
在具有复杂关联的模型中,很难保证对象更改的一致性。[……] 因此: 将实体和值对象聚集到聚合中,并围绕每个聚合定义边界。选择一个实体作为每个聚合的根,并允许外部对象仅保留对根的引用 好的,所以使用聚合的原因是为了避免中介 由于您正在进行CQR(这意味着DDD和事件源),因此您有一个命令端和一个查询端(命令-查询-请求分离)。如果您更熟悉CRUD风格的应用程序和关系数据库,那么很可能您关注的是查询端而不是命令端 让我们在CQR中澄清一些事情:
- 聚合仅与命令端相关
- 聚合负责处理命令和发布事件
- 聚合负责执行业务规则
Book.borrow(userId)会有什么错
如果允许用户借书,则哪个发布bookbrowed(bookId,userId)
事件
我应该在这两个聚合之间创建一个中间聚合吗
类似SQLJoin的东西?在这个例子中,我想看看如何
两个聚合相互通信的类似用例是
在Axon框架中实现
好问题。我先说不,然后试着帮你理解为什么
让我们从聚合存在的原因开始。从:
聚集体
在具有复杂关联的模型中,很难保证对象更改的一致性。[……] 因此: 将实体和值对象聚集到聚合中,并围绕每个聚合定义边界。选择一个实体作为每个聚合的根,并允许外部对象仅保留对根的引用 好的,所以使用聚合的原因是为了避免中介 由于您正在进行CQR(这意味着DDD和事件源),因此您有一个命令端和一个查询端(命令-查询-请求分离)。如果您更熟悉CRUD风格的应用程序和关系数据库,那么很可能您关注的是查询端而不是命令端 让我们在CQR中澄清一些事情:
- 聚合仅与命令端相关
- 聚合负责处理命令和发布事件
- 聚合负责执行业务规则