2019独角兽企业重金招聘Python工程师标准>>>

存储库是提供对聚合访问的机制。存储库充当了用于保存数据的实际存储机制的网关。在CQRS中,存储库只需要能够根据他们的惟一标识符找到聚合。任何其他类型的查询,应该在查询数据库中执行。

在Axon Framework中,所有存储库必须实现Repository接口。这个接口规定了三种方法:load(identifier, version), load(identifier)和newInstance(factoryMethod)。load方法允许你从存储库加载聚合。version可选参数是用来检测并发修改(见Advanced conflict detection and resolution)。newInstance用于注册新创建的聚合到存储库中。

基于你潜在的持久性存储和审计需求,有一些基础实现提供大了部分存储库所需的基本功能。Axon Framework对保存聚合当前状态的存储库(见Standard Repositories)和那些存储聚合事件的存储库(见 Event Sourcing Repositories)进行了区分。

注意,存储库接口没有声明delete(identifier)方法。删除聚合是通过在一个聚合内部调用AggregateLifecycle.markDeleted()方法完成的。删除聚合是一个与其他迁移一样的状态迁移,唯一的区别是它在许多情况下是不可逆的。你应该在聚合上创建自己的有意义的方法,来将聚合的状态设置为“已删除”。这也允许你注册你想要发布的任何事件。

Standard repositories(标准存储库)

标准存储库存储聚合的实际状态。在每次修改后,新的状态将覆盖旧的。这使得命令组件也可以使用应用程序的查询组件使用的相同信息。标准存储库存储聚合的实际状态。这可能取决于你正在创建的应用程序的类型,这是最简单的解决方案。如果是这样的话,Axon提供了一些帮助你实现这样一个存储库的构件。

Axon为标准存储库提供了一个开箱即用的实现:GenericJpaRepository。它认为聚合是一个有效的JPA实体。它使用EntityManagerProvider配置,EntityManagerProvider提供EntityManager来管理实际的持久化,并且一个类指定聚合的实际类型存储在存储库中。当聚合调用静态AggregateLifecycle.apply()方法时,你也可以通过EventBus去发布事件。

你也可以轻松实现自己的存储库。在这种情况下,最好从抽象类LockingRepository扩展。作为聚合的包装器类型,建议使用AnnotatedAggregate。看GenericJpaRepository的源码示例。

Event Sourcing repositories(事件溯源存储库)

聚合根能够根据事件重建它们的状态,也可以配置为通过事件溯源存储库加载。这些存储库不存储聚合本身,但存储聚合生成的一系列事件。基于这些事件,可以随时恢复聚合的状态。

在AxonFramework中,EventSourcingRepository实现提供了任何事件溯源存储库所需的基本功能。这依赖于EventStore(见Implementing your own Event Store),它抽象了实际的存储机制。

根据情况,你可以提供一个聚合工厂。AggregateFactory指定了如何创建一个聚合实例。一旦创建了一个聚合,EventSourcingRepository可以使用从事件存储中加载的事件来初始化。Axon Framework自带了一些你可以使用的AggregateFactory实现。如果他们还不够,可以很容易创建你自己的实现。

GenericAggregateFactory

GenericAggregateFactory是一种特别的AggregateFactory实现,可用于任何类型的事件溯源聚合根。GenericAggregateFactory创建存储库管理的聚合类型的一个实例。聚合类必须是非抽象的,声明一个默认的不进行初始化的无参构造函数化。
GenericAggregateFactory适用于大多数场景,聚合不需要专门注入non-serializable资源。

SpringPrototypeAggregateFactory

根据你的架构选择,使用Spring将依赖项注入到聚合中可能是有用的。例如,你可以将查询库注入到你的聚合,以确保某些值的存在(或不存在)。

注入依赖项到你的聚合,在定义了SpringPrototypeAggregateFactory的Spring上下文中,你需要配置一个聚合根的属性bean。不是使用构造函数创建的常规的实例,而是使用Spring应用程序上下文实例化你聚合。这也将在你的聚合中注入的任何依赖项。

实现自己的AggregateFactory

在某些情况下,GenericAggregateFactory不能提供你所需要的东西。例如,你可以有一个抽象的聚合类型与不同的场景的多个实现(例如,PublicUserAccount和BackOfficeAccount都扩展一个帐户)。而不是为每个聚合创建不同的存储库,你可以使用一个单独的存储库,并配置一个AggregateFactory意识到不同的实现。

聚合工厂大部分的工作是创建未初始化的聚合实例。它必须使用一个给定的聚合标识符和流中的第一个事件。通常,这个事件是一个创建事件,其中包含关于预期聚合类型的提示。你可以使用这些信息来选择一个实现并调用其构造函数。确保没有事件被应用于构造函数;聚合必须未初始化。

相对于简单的存储库直接加载聚合的实现,基于事件初始化聚合可能是一项耗时的工作,。CachingEventSourcingRepository提供一个可以从中加载聚合的缓存

作者:勇赴
链接:http://www.jianshu.com/p/585e95e31704
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://my.oschina.net/weechang93/blog/1551172

AxonFramework,存储库相关推荐

  1. CodeGen准备存储库

    CodeGen准备存储库 CodeGen几乎总是与提供用于生成源文件的元数据的存储库结构一起使用,并且许多令牌需要使用存储库结构. 基本要求是有一个结构定义,并且该结构定义包含一个或多个字段定义.有些 ...

  2. github组织存储库使用_为什么我不使用您的GitHub存储库

    github组织存储库使用 by Sam Westreich, PhD 由Sam Westreich博士 为什么我不使用您的GitHub存储库 (Why I'm not using your GitH ...

  3. 注意!今日起 GitHub 新建存储库的默认分支就不叫“master”了!

    整理 | 郑丽媛 头图 | CSDN下载自东方IC GitHub 宣布,自2020年10月1日起,在 GitHub 平台上创建的所有源代码存储库都将默认命名为 main ,而非原本的 master . ...

  4. 如何在GitHub上重命名存储库?

    本文翻译自:How do I rename a repository on GitHub? I wanted to rename one of my repositories on GitHub, b ...

  5. 存储库访问被拒绝。通过部署密钥进行访问是只读的

    本文翻译自:Repository access denied. access via a deployment key is read-only After successfully cloning ...

  6. 如何从Subversion存储库中git-svn克隆最后n个修订版?

    本文翻译自:How to git-svn clone the last n revisions from a Subversion repository? Problem 问题 How do you ...

  7. 如何在github存储库中添加屏幕截图到README?

    本文翻译自:How to add screenshot to READMEs in github repository? Is it possible to place a screenshot in ...

  8. 将现有Git存储库推送到SVN

    我一直在用Git完成所有工作并推送到GitHub. 我对软件和网站都非常满意,我不想在此时改变我的工作方式. 我的博士生顾问要求所有学生将他们的工作保存在大学托管的SVN存储库中. 我已经找到大量关于 ...

  9. 如何将github存储库回滚到特定提交?

    我的github现在有100个提交. 我需要回滚存储库以提交80,并删除所有后续存储库. 为什么? 该回购应该用于其他用户的合并. 由于过度的编辑,大量合并作为我提交的内容. 那是由于我的远程分支贴错 ...

最新文章

  1. mysql备份和还原数据库
  2. Java_Shell多线程
  3. 批量选中删除(包含全选)---jsp,servlet
  4. Servlet_概述
  5. 认证授权方案之授权揭秘 (上篇)
  6. ubuntu下安装django
  7. SQLI-LABS(二)
  8. 启动计算机时页面配置出现问题,开机提示“由于启动计算机时出现了页面配置问题…”...
  9. C++安全方向:openssl,剧场版,一个字节多少位
  10. GitHub 在热门 Node.js changelog 开源库Standard Version中发现 RCE 漏洞
  11. ROS-cmakelists的解释
  12. IIS 发布的FTP提供下载时的转码问题
  13. steam授权_恐怖游戏爱好者的福音!十一月Steam上最值得玩的恐怖游戏
  14. AllWinner--R329
  15. aaa logo汉子字体_AAA Logo –标志设计软件
  16. 长方形图片填充为正方形
  17. 从零开始设计RISC-V处理器——指令系统
  18. n−皇后问题 (dfs)
  19. 2019 ICPC 南京 F题 Paper Grading
  20. 云聚高性能,论道“新超算”

热门文章

  1. 机器学习中的数学(七)--凸优化的基础知识
  2. 7-4 吃货的最短路径 (10 分)
  3. 7-2 定义日期类 (28 分)
  4. android getevent 代码,Getevent  |  Android 开源项目  |  Android Open Source Project
  5. android imageview图片旋转动画,Android 安卓动画 属性动画 - 旋转动画
  6. php 405跳转,php采用curl访问域名返回405 method not allowed提示的解决方法
  7. java推荐系统算法,阿里“推荐系统”背后的算法介绍
  8. excel怎么设置一个按钮就一点就生成一个表_条码生成软件如何批量生成DPD条码...
  9. Objective-C ,ios,iphone开发基础:ios数据库(The SQLite Database),使用终端进行简单的数据库操作...
  10. 实验二:编写输出Hello World!