首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ncqrs重新创建完整的ReadModel

Ncqrs重新创建完整的ReadModel
EN

Stack Overflow用户
提问于 2011-09-14 05:22:04
回答 3查看 325关注 0票数 1

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

编辑:

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-21 16:59:32

我最终做的事情如下所示。在服务启动时,在处理任何命令之前,如果读取模型发生了变化,我会丢弃它,并通过在我的反规格化程序中处理所有过去的事件从头开始重新创建它。这是在数据库初始化器的种子方法中完成的。

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

票数 1
EN

Stack Overflow用户

发布于 2011-09-21 05:15:19

不幸的是,没有任何内置的东西可以为你做这件事(虽然我很久没有更新我使用的ncqrs版本了,所以可能已经改变了)。这样做在某种程度上也不是微不足道的,因为它取决于您到底想要做什么。

我做这件事的方式(到目前为止我还没有必要)是:

  • 调用事件存储以获取所有相关事件

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

  • 从头开始在内存中重新创建读取模型(以节省缓慢和不必要的写入)
  • 再次存储重新创建的读取模型,而不是对事件存储的现有一次
  • 调用,以获取任何可能已被missed
  • Repeat的事件,直到没有新事件返回

为止

需要注意的一件事是,如果您要从头开始重新创建整个读取模型数据库,我将暂时使服务脱机或将新事件排入队列,直到您完成。

同样,你可以用不同的方法来解决这个问题,你的架构和场景可能会决定如何最好地做到这一点。

票数 2
EN

Stack Overflow用户

发布于 2011-11-28 20:31:15

我们使用MsSqlServerEventStore来重放我实现了以下代码的所有事件:

代码语言:javascript
复制
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仅查询事件存储并返回事件存储中的第一个Id (其中SequentialId = 1)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7408698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档