c# - CQRS - 如何处理用户查看页面或查询

标签 c# design-patterns cqrs event-sourcing

我正在将 CQRS 用于我正在构建的应用程序(具有复杂业务逻辑的在线讨论系统),但我在实现过程中遇到了让我担心的部分。

我应该如何处理综合浏览量?如果用户查看线程,我想跟踪它。因为我想跟踪它,所以我应该创建一个命令和一个事件,并将其绑定(bind)到负责我正在查看的对象的聚合根(例如,分别为 UserViewsThread 和 UserViewedThread)。但这似乎非常低效——除此之外,没有理由在讨论系统的许多用例(查看论坛/线程)中找到聚合根。现在我要介绍这个,我将在页面的每个 View 上有一个额外的命令分派(dispatch)和事件发布,这反过来负责“假脱机”线程聚合,序列化我的事件,并将它发送到我的事件出版商。

必须有更好的方法来做到这一点。我当时在考虑也许可以让我的 Controller 对象能够调度事件 - 但是通过绕过我的聚合,我不能再将行为附加到页面 View 。

另一种可能性是使用它来验证我的用户。 UserViewsThread 和 UserViewsForum 命令将被允许抛出身份验证异常,让我的 Controller 知道用户无法执行此操作。但是,如果将这些转化为事件,并存储在我的事件存储中,我们正在讨论在每个页面 View 上创建的多个事件——这很可能会破坏性能(每个页面 View 都会导致数据库事务……呃)和资源管理。

你的家伙有什么想法?

最佳答案

使用 CQRS 并不意味着与应用程序的每个微小交互(尤其是与基础架构相关的交互)都必须传递命令/事件链。跟踪综合浏览量是一个交叉问题,可以轻松单独实现。

只是让读取层中的查询在每次被调用时为某个表中的相应 View 模型增加一个计数器

一旦您开始创建每次调用查询时都会改变状态的命令,您就会再次紧密耦合读取和写入,命令/查询分离的全部好处就会付之东流。您首先使用 CQRS 将这两个问题分开。

关于c# - CQRS - 如何处理用户查看页面或查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3705673/

相关文章:

c# - System.Timers.Timer 的 Elapsed 回调可以是异步的吗?

c++ - 如何让人们相信一个有 11975 行代码的类是不好的? (不是吗?)

c# - CQRS 模式上的服务层

c# - Array.Find 与委托(delegate)。如果没有找到返回什么?

c# - WPF 最上面的选项使全屏应用程序转义

ios - 如果游戏使用 MVC 模式(在 iOS 上),则有 3 个类 : MVC, 但为什么要使用额外的类 ComputerPlayer?

asp.net - Asp.Net WebForms 上的 MVP

php - DDD/CQRS/ES - 如何以及在何处实现防护

cqrs - Command Dispatcher 和 Mediator 设计模式有什么区别?

c# - .net Framework 4.0 中地理 sql server 数据类型的 C# 等价物是什么?