2014-11-03 154 views
2

在CQRS中,我该如何坚持查看计数信息?例如用户访问特定页面x次CQRS页面查看计数

简单的答案是,读取模型更新其自己的表并增加计数。

但是如果我们需要从写模型中重新构建读模型呢?我们将丢失所有查看次数统计信息。

阅读模型是否应该调用写模型并告诉它页面已被查看?

与此相关的问题是写入模型现在有太多关于读取模型实现的信息,即写入模型不应该知道读取模型如何显示页面。它应该从所有的读取模型中分离出来。

人们如何在他们的系统中实现这一点?

+0

对于http://Programmers.stackexchange.com,这确实是一个问题。 – Mgetz 2014-11-03 18:09:13

+0

您可以将每次读取审计排队到命令队列中,就像任何其他命令一样。然后这将被写入适用的写入存储器,该存储器将(最终)被投影回原始读取存储器。如果readstore的读取频率很高(应该这样,因为这就是您选择CQRS的原因:),您可能需要批量更新以限制写入的频率。 – StuartLC 2014-11-03 18:14:09

+0

@Mgetz你想写一个完整答案的答案和一些解释吗?这将帮助我和其他人前进 – 2014-11-03 18:16:03

回答

1

您可能希望跟踪或存储的任何数据都是通过编写模型来完成的,您不应该因为某些看起来微不足道的事情或打破关注而打破CQRS的原则。

在这种特殊情况下,您将引入一个数据视图跟踪域,它不需要知道其数据来自何处。

如果您使用EventSourcing作为您的数据存储区,则可以将所有内容短路,并在收到页面请求时发出DataViewedEvent

该命令可能类似于dataViewed(obj),其中obj可以是读取模型所需的任何东西。该obj然后附加到DataViewedEvent。

这意味着当读取模型接收DataViewedEvent时,它可以查看保存在事件中的obj类型,并只将它传递给关注该obj类型的处理程序。

例如

查看X页面。调用dataViewed(PageXViewed)命令。 Read Model接收dataViewed事件,查看存储在其中的对象,将PageXViewed传递给关注该页面视图的处理程序。

+0

这很有道理。你会拉入一种Sub Write模式吗?由于数据只对特定的读取模型感兴趣。例如,您可以让多个Read Model订阅者以不同的方式呈现信息和页面,并要求存储不同的统计信息。如果'主'写模型必须处理它,它可能会变得有点混乱 – 2014-11-03 18:22:21

+0

@Gaz_Edge这就是为什么我会使用EventSourcing,然后我的写模型变得非常简单,我不会在意。这只是流中的另一个事件。但是,除非有专门的服务,否则我不会冒昧地将其分解出去,因为它真的是它自己的领域,应该这样对待。 – Mgetz 2014-11-03 18:23:30

+0

是的,我使用事件采购。我认为一个更好的方法可能是使用命令DataViewed(Obj),它从Read Model中获取序列化对象,并将其添加到事件存储中。在反序列化中,读取模型可以检查对象的类型,然后只将它发送给关心它的视图。否则,你最终会有每个视图检查每个UriViewedEvent – 2014-11-03 18:28:17