我正在将 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/