Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CQRS-如何处理查看页面或查询的用户_C#_Design Patterns_Cqrs_Event Sourcing - Fatal编程技术网

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

C# CQRS-如何处理查看页面或查询的用户,c#,design-patterns,cqrs,event-sourcing,C#,Design Patterns,Cqrs,Event Sourcing,我正在为我正在构建的一个应用程序(一个具有复杂业务逻辑的在线讨论系统)使用CQRS,而我在实现中遇到了令我担忧的一部分 我应该如何处理页面浏览?如果用户查看一个线程,我想跟踪它。因为我想跟踪它,所以我应该创建一个命令和一个事件,并将其绑定到负责我正在查看的对象的聚合根中(例如,分别是UserViewsThread和UserViewedThread)。但这似乎效率很低——除此之外,在讨论系统的许多用例中(查看论坛/线程),没有理由使用聚合根。既然我已经介绍了这一点,我将在页面的每个视图上都有一个额

我正在为我正在构建的一个应用程序(一个具有复杂业务逻辑的在线讨论系统)使用CQRS,而我在实现中遇到了令我担忧的一部分

我应该如何处理页面浏览?如果用户查看一个线程,我想跟踪它。因为我想跟踪它,所以我应该创建一个命令和一个事件,并将其绑定到负责我正在查看的对象的聚合根中(例如,分别是UserViewsThread和UserViewedThread)。但这似乎效率很低——除此之外,在讨论系统的许多用例中(查看论坛/线程),没有理由使用聚合根。既然我已经介绍了这一点,我将在页面的每个视图上都有一个额外的命令分派和事件发布,它反过来负责“假脱机”线程聚合、序列化事件并将其发送给事件发布者

必须有更好的方法来做到这一点。我曾经考虑过这样做,使我的控制器对象能够调度事件——但通过绕过聚合,我无法再将行为附加到页面视图

另一种可能性是将其用作对我的用户进行身份验证的方法。将允许UserViewsThread和UserViewsForum命令引发身份验证异常,以让我的控制器知道用户无法执行此操作。但是,如果这些被转换成事件,并存储在我的事件存储中,我们所说的是在每个页面视图上创建的多个事件——这很可能会破坏性能(每个页面视图都会导致数据库事务…呃)和资源管理


你的人的想法是什么?

你可以在会话中捕获跟踪信息,并偶尔将其发送到服务器


此外,为什么您认为您真的需要使用带有事件存储的AR来跟踪此信息?我会在一些基于状态的存储中聚合这些信息。

我们所做的几乎与此相同。但是,像这样跟踪所有内容是不对的,您的读取速度应该很快,不需要执行任何写入操作

我们最终在所有事件中添加了一个跟踪对象,但我想我不会再这样做了。我将研究编写一些javascript,就像google analytics一样,并从前端创建一个单独的命令


另外,我会将跟踪队列和普通队列分开。

它似乎是一个web应用程序,因此我会创建一个属性(asp.net mvc/WebApi),用于处理页面视图。当然,该属性只会调用一个基础设施服务(因为我认为跟踪统计数据不是域的一部分),它只会更新存储中的页面视图。简单地说,该服务调用一个Dao来更新持久性(update Posts set pageviews=pageviews+1)

当然,该属性可以只发送async命令来更新将在后台执行的页面视图,这样“写入”实际上不会干扰读取

如果你的应用程序有/将有很多流量,那么我建议使用以下持久化策略:有一个PageViews表(PageId、ViewsNumber、TimeStamp),其中你只需为每个页面视图添加一行。然后每隔X分钟,有一个后台服务,它将执行Sum(ViewsNumber)GroupBy(PageId),其中TimeStamp>oldtimstamp。你不会有毫秒级的统计数据,但它们会经常更新,应用程序会保持响应速度


我不认为这个问题在你建立分析系统之外的任何领域的一部分,所以你不需要AR,DDD或事件采购。对于您的情况,页面统计信息是附加到页面的信息,而不是页面的一部分。它们只有在读取模型中才被考虑在一起,您可以在同一视图中实际显示它们。

使用CQR并不意味着与应用程序的每个微小交互(尤其是与我的基础架构相关的交互)都必须传递命令/事件链。跟踪页面浏览量是一个跨领域的问题,可以很容易地单独实现

只要让读取层中的查询在每次调用时为某些表中的各个视图模型增加一个计数器


一旦您开始创建每次调用查询时都会改变状态的命令,您将再次紧密地耦合读写,并且命令/查询分离的全部好处都将付诸东流。首先,您使用CQR来分离这两个关注点。

用户的看法在报告中可能非常重要。如果我的报告基础设施使用事件存储将事件回复到我的阅读模型中,那么我将能够基于特定查询的用户视图构建更细粒度的报告。就我个人而言,我更喜欢使用Google analytics跟踪访问。值得一提的是,如果每个页面视图都将生成一个事件,那么聚合根目录可能会有严重的并发问题。OP应该使用statsd进行跟踪,因为它非常快-您可以在后台处理页面视图,并根据收集的数据更新域模型。