3 Axon是一个基于DDD领域驱动设计的搭建CQRS架构的框架,特点是可以和Spring整合。 Axon可以帮助简化建立基于EDA架构的CQRS应用,它对Domain Events的支持比较丰富,特别增强了Jdonframework没有的领域事件中的事务支持(不过个人觉得处理起来要复杂,因为事务本身就很棘手)。 Axon最大特点就是严格按照CQRS定义来编程,比如Command EventStore等等,好处是熟悉CQRS的人比较易懂,个人认为缺点是和DDD的统一语言要求有些距离了,如果只懂DDD,不懂CQRS的术语,还是不能方便使用Axon,这方面好像有些逻辑上疙瘩。个人观点。 开发步骤: 1.结合Maven建立项目Project,配置好需要的包。 2.建立Command类,如下:
建立Domain Events类,如下:
如果用Annotation注解来标明DomainEvent,也许更好(应该有),使用继承有些侵入性。 这些步骤之前,应该假设Order等领域模型已经建立好,上面这些类都应该属于行为操作性质,以前我们是写在Service中的。 3.建立CommandHandler,前面有事件发生,这里就有事件处理了,这里实际遵循事件模式中两个主题:触发者;接收者,CommandHandler属于接收者。关于CommandHandler讨论可见OOJDON的观点。 接受Order订单的创建命令的处理者Handler代码如下,需要使用@CommandHandler标注:
在confirmOrder中,我们注意它委托了order.confirm(),让领域模型Order的方法confirm()确认自己的创建。 从这里看出,CommandHandler类似我们MVC中Controller,也就是控制器,专门接受来自界面的命令事件,类似Struts等中Action;JSF等中的界面Bean,或者类似Swing等中Listerner,或者类似SOA中的服务。当然在Jdonframework中,结合Struts 1.x的Handler可以节省不用写。 在DCI架构中,Handler这里实际就是场景发生地,在简洁优雅上,DCI架构要比CQRS更简单,更倾向于业务统一语言,否则,只懂业务的领域专家还要学习设计模式中事件命令模式,将业务再翻译成事件语言,多一层翻译,就多一层信息失真,以前是将业务翻译成数据库语言,现在推翻了,就不能再多翻译这一层了。 前面谈到CommandHanlder再次触发Domain Model领域模型 Order中的方法,内容如下:
最后一步,编写查询Query组件:
看得出来,Axon可能没有对查询进行更多支持,JdonFramework提供查询缓存优化,自动分页查询等功能,将查询和命令之间数据共享通过缓存联系封装起来,更简化CQRS的查询和命令分离后的再结合。 从Axon和Jdonframework 6.0版本等CQRS框架看得出来,事件是一个解决领域驱动技术架构的好方法,但是如果事件比较多,都在空中飞来飞去,增加编程复杂性和代码可阅读性,这时,DCI架构,将模型带上角色帽子,拉到当前场景,让其演出,表演交互行为,就更加符合业务,符合DDD统一语言这个概念。 案例源码: http://axonframework./files/axon_tutorial.zip [该贴被banq于2011-01-05 10:02修改过] |
|
来自: CevenCheng > 《DDD》