使用 Ncqrs,有没有办法重播曾经发生的每一个事件(所有聚合类型)并通过我的非规范化器提供这些事件,以便从头开始重新创建整个读取模型?
编辑:
我认为最好提供一个更具体的用例。我在 ASP.NET MVC 应用程序中构建它,并使用实体框架(代码优先)来处理读取模型。为了加快开发速度(并且因为我很懒),我想使用一个数据库初始化程序,一旦任何读取模型发生更改,它就会重新创建数据库模式。然后使用初始化程序的种子方法重新填充它们。
使用 Ncqrs,有没有办法重播曾经发生的每一个事件(所有聚合类型)并通过我的非规范化器提供这些事件,以便从头开始重新创建整个读取模型?
编辑:
我认为最好提供一个更具体的用例。我在 ASP.NET MVC 应用程序中构建它,并使用实体框架(代码优先)来处理读取模型。为了加快开发速度(并且因为我很懒),我想使用一个数据库初始化程序,一旦任何读取模型发生更改,它就会重新创建数据库模式。然后使用初始化程序的种子方法重新填充它们。
我们使用 MsSqlServerEventStore 来重放我实现以下代码的所有事件:
var myEventBus = NcqrsEnvironment.Get<IEventBus>();
if (myEventBus == null) throw new Exception("EventBus is not found in NcqesEnvironment");
var myEventStore = NcqrsEnvironment.Get<IEventStore>() as MsSqlServerEventStore;
if (myEventStore == null) throw new Exception("MsSqlServerEventStore is not found in NcqesEnvironment");
var myEvents = myEventStore.GetEventsAfter(GetFirstEventIdFromEventStore(), int.MaxValue);
myEventBus.Publish(myEvents);
这将推送事件总线上的所有事件,并且非规范化器将处理所有事件。函数 GetFirstEventIdFromEventStore 只是查询事件存储并从事件存储返回第一个 Id(其中 SequentialId = 1)
不幸的是,没有任何内置功能可以为您执行此操作(尽管我已经有一段时间没有更新我使用的 ncqrs 版本了,所以可能已经改变了)。这样做也有些重要,因为它完全取决于您想要做什么。
我这样做的方式(到目前为止我还没有需要)是:
根据您正在执行的操作,这可能是所有事件,也可能只是一个聚合根的事件,或者一个或多个聚合根的事件子集。
从头开始在内存中重新创建读取模型(以节省缓慢和不必要的写入)
将重新创建的读取模型存储在现有的位置
再次致电活动商店以获取可能错过的任何活动
重复直到没有新的事件被返回
需要注意的一点是,如果您要从头开始重新创建整个读取模型数据库,我会暂时离线服务或将新事件排队,直到您完成。
同样有不同的方法可以解决这个问题,你的架构和场景可能会决定如何最好地做到这一点。
我最终做的是以下。在服务启动时,在处理任何命令之前,如果读取模型已更改,我会将其丢弃并通过处理我的非规范化器中的所有过去事件从头开始重新创建它。这是在数据库初始化程序的种子方法中完成的。
这是一项使用 MS SQL 事件存储的简单任务,因为有一种方法可以检索所有事件。但是,我不确定其他事件存储。