Ncqrs重新创建完整的ReadModel

时间:2011-09-13 21:22:04

标签: ncqrs

使用Ncqrs,有没有办法重播所发生的每一个事件(所有聚合类型)并通过我的非规范化器提供这些事件,以便从头开始重新创建整个读取模型?

编辑:

我虽然提供更具体的用例是件好事。我正在ASP.NET MVC应用程序中构建它,并使用Entity Framework(代码优先)来处理读取模型。为了加速开发(因为我很懒),我想使用数据库初始化程序,一旦任何读取模型更改,就会重新创建数据库模式。然后使用初始化程序的种子方法重新填充它们。

3 个答案:

答案 0 :(得分:2)

遗憾的是,没有内置任何内容可以为您执行此操作(尽管我还没有更新我在相当长一段时间内使用的ncqrs版本,所以可能已经更改了)。这样做有点不重要,因为它取决于你想要做什么。

我这样做的方式(到目前为止我没有必要)将是:

  • 致电活动商店以获取所有相关活动

根据您的操作,这可能是所有事件,也可能只是一个聚合根的事件,或一个或多个聚合根的事件子集。

  • 从头开始在内存中重新创建读取模型(以节省缓慢和不必要的写入)

  • 存储重新创建的读取模型以代替现有的读取模型

  • 再次致电活动商店以获取可能遗漏的任何活动

  • 重复直到没有返回新事件

有一点需要注意,如果您从头开始重新创建整个读取模型数据库,我会暂时离线服务或排队新事件直到您完成。

同样,您可以通过不同的方式解决此问题,您的架构和方案可能会决定如何做到最好。

答案 1 :(得分:2)

我们使用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);

这将推送eventbus上的所有事件,而非规范化器将处理所有事件。函数GetFirstEventIdFromEventStore只查询eventstore并从eventstore返回第一个Id(其中SequentialId = 1)

答案 2 :(得分:1)

我最终做的是以下内容。在服务启动时,在处理任何命令之前,如果读取模型已更改,我将其丢弃并通过处理我的非规范化器中的所有过去事件从头开始重新创建它。这是在数据库初始化程序的种子方法中完成的。

这是使用MS SQL事件存储的一项微不足道的任务,因为有一种方法可以检索所有事件。但是,我不确定其他事件存储。