Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 轴突框架中两个聚合体之间的通信_Spring Boot_Domain Driven Design_Cqrs_Axon - Fatal编程技术网

Spring boot 轴突框架中两个聚合体之间的通信

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 @聚合 公共类图书总量{ @聚合

我不熟悉Axon框架、CQRS和DDD。我被教导使用关系数据库创建简单的CRUD应用程序。因此,我首先关注的是构建数据模型,而不是域模型。 我想改变我对软件的态度,以更务实的方式创建真实世界的应用程序。因此,我想使用CQRS模式和事件源

我现在正在使用SpringBoot和Axon框架开发一个库应用程序。其中一个基本要求是用户已经借阅了这本书。我有两个聚合用户和书籍

这是我的书:

@数据
@AllArgsConstructor@NoArgsConstructor
@聚合
公共类图书总量{
@聚合标识符
私有UUID;
私有字符串名称;
私有字符串isbnNumber;
私人国际货币基金组织;
私人作者;
私人体裁;
私人出版社;
...
这是我的用户聚合:

@数据
@AllArgsConstructor@NoArgsConstructor
@聚合
公共类用户聚合{
@聚合标识符
私有UUID;
私有字符串名;
私有字符串lastName;
私人字符串电子邮件;
私有字符串密码;
私有字符串确认密码;
私人设定角色;
私人生日;
专用字符串电话号码;
私人地址;
...
我的问题是:我是否应该在这两个聚合之间创建一个中间聚合,比如SQLJOIN?在这个示例中,我想看看在Axon框架中如何实现两个聚合相互通信的类似用例

我应该在这两个聚合之间创建一个中间聚合吗 类似SQLJoin的东西?在这个例子中,我想看看如何 两个聚合相互通信的类似用例是 在Axon框架中实现

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

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

聚集体

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

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

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

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

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

  • 聚合仅与命令端相关
  • 聚合负责处理命令和发布事件
  • 聚合负责执行业务规则
这意味着对于命令端: 命令被传递给聚合,聚合决定是发布事件还是拒绝命令

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

因此,我首先关注的是构建数据模型,而不是域 模型

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

因为您还没有关注域模型,所以您还不必关心聚合:)

再次回到你原来的问题:

其中一个基本要求是用户已经借阅了这本书

我应该在这两个聚合之间创建一个中间聚合吗 像SQL连接之类的东西

基于你的域,你已经有了一个用户和书籍聚合。你有一个用户可以借书的单一要求。现在我不是你域的专家,但问问你自己:为什么你需要另一个聚合?这个新聚合要负责什么?仅仅拥有
Book.borrow(userId)会有什么错
如果允许用户借书,则哪个发布
bookbrowed(bookId,userId)
事件

我应该在这两个聚合之间创建一个中间聚合吗 类似SQLJoin的东西?在这个例子中,我想看看如何 两个聚合相互通信的类似用例是 在Axon框架中实现

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

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

聚集体

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

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

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

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

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

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