DDD随笔-Axon
1. 命令处理程序从存储库中检索域对象(聚合)并执行它们的方法来更改它们的状态。这些聚合通常包含实际的业务逻辑,因此负责维护自己的状态。聚合的状态变化导致产生领域事件。领域事件和聚合形成领域模型。
2.Saga是CQRS中的概念,用于管理这些复杂的业务事物。
命令
命令描述了改变应用程序状态的意图。它们被实现为(最好是只读的)POJO并使用CommandMessage的实现来进行封装。
命令总是只有一个目的地。尽管发件人并不关心哪个组件处理命令或组件驻留的位置,但对知道它的结果可能很有趣。这就是为什么通过命令总线发送的命令消息允许返回结果的原因
事件
事件是描述应用程序中发生的事件的对象。事件的典型来源是聚合。在Aggregate内发生重要事件时,它将引发一个事件。 在Axon Framework中,事件可以是任何对象。 强烈建议您确保所有事件都是可序列化的。
当事件分派时,Axon将它们包装在一个EventMessage中。使用的消息的实际类型取决于事件的来源。当一个事件由一个Aggregate引发时,它被包装在一个DomainEventMessage(它扩展了EventMessage)中。 所有其他事件都包装在一个EventMessage中。 除了像唯一标识符这样的常见消息属性外,EventMessage还包含一个时间戳。DomainEventMessage还包含引发该事件的聚合的类型和标识符。 它还包含聚集事件流中事件的序列号,它允许重现事件的顺序。
注意,即使DomainEventMessage包含对AggregateIdentifier的引用,您也应始终在实际的Event中包含标识符。虽然EventEventMessage使用DomainEventMessage中的标识符来存储事件,但对于其它情况不会提供一个可靠的值作为标识符。
。聚合可以是任何对象,但是对于标识对象本身需要有几条准则,
- 它必须实现equals和hashCode以确保与其他实例进行唯一性区分;
- 实现一个提供一致结果的toString()方法(相同的标识符应该提供一个相等的toString()结果)和
- 是可序列化的。
参考:https://blog.csdn.net/wangli13860426642/article/details/80662753


复杂的聚合结构
复杂的业务逻辑通常需要的不仅仅是聚合根可以提供的聚合。在这种情况下,将复杂性分散到聚合中的许多实体是很重要的。在使用event sourcing时,不仅聚合根需要使用事件来触发状态转换,而且聚合中的每个实体也是如此。
注意,一个关于聚合不应该暴露状态的常见误解是:聚合中的任何实体都不应该含有属性访问方法,不是的。实际上,如果聚合中的实体向同一聚合中的其他实体暴露状态,则聚合可能会受益匪浅。但是,建议不要把状态暴露到聚合之外。
Axon为复杂聚合结构中的event sourcing提供支持。声明子实体的字段必须使用@AggregateMember进行注释。 此注释告诉Axon注释的字段包含应该检查命令和事件处理程序的类。当一个实体(包括聚集根)应用一个事件时,它首先由聚合根处理,然后通过所有@AggregateMember注释字段向下传递到其子实体。
可能包含子实体的字段必须使用@AggregateMember进行注释。 此注释可用于多种字段类型:
- 实体类型,在字段中直接引用;
- 集合类型(包含所有集合,如Set,List等);
- java.util.Map类型;
>>>>>>>>>>>>>>>>>>>>>阅读到 复杂的聚合结构 《三》--https://blog.csdn.net/wangli13860426642/article/details/80662753
DDD随笔-Axon的更多相关文章
- Python-数据库支持
10.Python-数据库支持 使用数据库的好处: a.支持数据的并发访问,多个用户同时对基于磁盘的数据进行读写而不造成任何文件的损坏: b.支持根据多个数据字段或属性进行复杂的搜索: 1.如何操作数 ...
- DDD CQRS架构和传统架构的优缺点比较
明天就是大年三十了,今天在家有空,想集中整理一下CQRS架构的特点以及相比传统架构的优缺点分析.先提前祝大家猴年新春快乐.万事如意.身体健康! 最近几年,在DDD的领域,我们经常会看到CQRS架构的概 ...
- DDD初学指南
去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...
- DDD为何叫好不叫座?兼论DCI与业务分析的方法论
今天,仔细阅读了园子里面的一个朋友写的<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>(http://www.cnblogs.com/ ...
- DDD,ORM还是Ado.Net
三层还是DDD,ORM还是Ado.Net,何去何从? 我本想把这个问题放到博问去,前几次有去博问问过之类的问题,无奈大神们可能都不屑回答别人的低级问题.所以放到随笔里,一方面把自己对ORM.架构的一些 ...
- 开始DDD
如何开始DDD(完) 连续写了两篇文章,这一篇我想是序的完结篇了.结合用户注册的例子再将他简单丰富一下.在这里只添加一个简单需求,就是用户注册成功后给用户发一封邮件.补充一下之前的代码 public ...
- 【DDD】--好文收藏
发现一批好文,完整系列,攒~~ 随笔分类 - DDD - 『圣杰』 DDD理论学习系列(1)-- 通用语言 笔记: 通用语言: a) 简单,便于理解.传播. b) 需要通用,能够准确的传达业务规则. ...
- 搭建一个Web API项目(DDD)
传送阵:写在最后 一.创建一个能跑的起来的Web API项目 1.建一个空的 ASP.NET Web应用 (为什么不直接添加一个Web API项目呢,那样会有些多余的内容(如js.css.Areas等 ...
- 三层还是DDD,ORM还是Ado.Net,何去何从?
我本想把这个问题放到博问去,前几次有去博问问过之类的问题,无奈大神们可能都不屑回答别人的低级问题.所以放到随笔里,一方面把自己对ORM.架构的一些看法写下来抛砖引玉,另一方面最主要的是想寻求大神们指指 ...
随机推荐
- ApplicationDomain
ApplicationDomain 类的用途是存储 ActionScript 3.0 定义表.SWF 文件中的所有代码被定义为存在于ApplicationDomain 中.在使用 Loader 类 A ...
- Android开发之Activity生命周期篇
一.Activity: 1.Activity:Activity是一个与用记交互的系统模块,几乎所有的Activity都是和用户进行交互的. 2.在Android中Activity主要是用来做控制的,它 ...
- [转] 关于 Ceph PG
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- 每天一点点oracle
每天一点点oracle sqlplus / as sysdba [oracle@oracle ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 ...
- NPF or NPCAP service is not installed
"NPF or NPCAP service is not installed" "could not start local server process:GNS3&qu ...
- [UE4]关于分支Sequence和条件分支的组合用法
当需要不管条件语句是否成立的后面都需要执行的语句,可以使用“Sequence”来分支,达到简化蓝图连线的目的.如下图所示:
- [UE4]蓝图的颜色
一.蓝色:调用的函数或事件 二.绿色:纯函数 三.紫色:函数定义 四.灰色:宏 五.白色:执行线 六.事件的定义 另外还有数据类型的颜色: 执行线是白色,数据线颜色跟数据量类型一致.
- Unreal Engine 4 动态切割模型实现
转自:http://gad.qq.com/article/detail/33199 <合金装备:复仇>里面,有一个很有趣的设定,游戏里大部分的场景和物件都可以用主角的刀动态切割. UE4中 ...
- 把SAS批提交添加到鼠标右键
下载注册表管理工具:RegSeeker Portable v2.57 中文绿色便携版 在RegSeeker中搜索:batch
- CRM 2016 一个IFrame_A 刷新另一个 IFrame_B
思路是 : 1 创建一个字段“new_xxx”. 2 注册字段 OnChange 事件. 3 OnChange 事件 刷新 IFrame_B子页面. CRM父页面JS: /// <summary ...