AxonFramework,存储库

存储库是提供对聚合访问的机制。存储库充当了用于保存数据的实际存储机制的网关。在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提供一个可以从中加载聚合的缓存

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,717评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,376评论 25 707
  • 昨晚,一个人在酒吧街闲逛,拍了照片发到大学好友群里,没说话。一会,老铁问:“跟同事?” 我回:“我想你们这群傻逼了...
    嘻嘻嘻嘻嘻嘻201708阅读 212评论 0 1
  • 不知道伙伴们在看完第一期的《朗读者》之后,进行的实践是什么?有的人选择给自己喜欢的人读一首诗;有的人选择给远方的他...
    7515b237f6ce阅读 618评论 0 1