如何使用 CQS 进行读写

Posted

技术标签:

【中文标题】如何使用 CQS 进行读写【英文标题】:How to Read and Write using CQS 【发布时间】:2013-10-04 16:57:20 【问题描述】:

我将使用 CQS(作为其设计的一个方面)开始一个新项目,但没有 CQRS + 事件溯源、事件流处理或历史建模。当我遇到这样一种情况时,我将有一大群人使用一小部分数据(并且不想阻止用户),我将实施事件溯源。这意味着(至少对我而言)我所做的只是从命令与查询的分离(关注点分离)开始。

我在命令端使用 EF ORM 和实际的 Schema。在查询方面,最好只使用视图(根据我正在阅读的内容),但我认为这种观点并不妨碍我使用 ORM(或不使用)和/或 Repo,或 ADO.NET + 存储过程,等等,作为从数据库访问这些视图的方法(我认为)。

这是我为大致说明我的想法而制作的图表(它绝不是全面的):

我的问题:

第 1 部分:我不知道在某些时候迁移到事件溯源的正确/最佳/最容易/最优化/最可维护/最容易的方式(我意识到这是主观的)从数据库(来自视图)并使用 ViewModels (DTO) 为客户端提供某些状态的新视图(在调用命令端之后)?

第 2 部分:在我更改了基于任务的 Web UI 并因此更改了 UI 基础的 ViewModel 之后,当 ViewModel 与实体(域模型)完全分离时,我如何从中发出命令指挥方面。这些 ViewModel (DTO) 可能是与实体完全不同的“形状”。

更新

需要明确的是,我不打算使用异步和事务是一个加号开始,这只是命令和查询分离(不是完整的 CQRS,命令端只返回“void”)——我'我在这里寻找非常基础的东西。此外,从我目前所读的内容来看,似乎 DDD 和有界上下文与 CQRS 齐头并进,在这一点上,我对 DDD 或聚合根以及有界上下文没有真正的经验,到目前为止还没有看到真正和迫切需要参与这种方法/模式。目前,我似乎将在命令端使用 EF/Migrations,但尚未决定在查询端使用什么(正在考虑使用 ADO.NET)。

在我的例子中,命令端将返回一个对象,例如一个新客户,它具有数据库生成的 CustomerId。我将为命令和查询使用一个数据库,并希望使用数据库中构建的视图作为查询的返回模型(换句话说,我希望查询大部分“映射”到视图) .我不知道如果我要使用查询端为命令端返回数据,在应该返回对象的情况下,命令应该如何看待。在 MVC 的情况下,我将尝试结合 Automapper 将对象转换为 ViewModel。

【问题讨论】:

【参考方案1】:

我必须承认我很难在这里找到真正的问题,但我会以标题作为我回答的基础。

首先,您声明您不会使用 CQRS,但您提出的解决方案非常接近 CQRS 架构,比其他任何东西都更接近。作为初学者并尝试一种模式但同时对其进行大量修改会增加高度的复杂性。

基本上,为了能够使用 CQS 成功读写,调用者必须控制 Id 的生成。这使您可以保存对象,然后在以后检索它,而不必依赖命令操作返回值。向导是这方面的绝佳选择。

我还应该指出,CQS 和 CQRS 作为模式之间存在很大差异。 CQS 是一种低级模式,几乎可以在任何架构中应用,而 CQRS 是非常高级的模式。他们共享设计理念,但仅此而已。

【讨论】:

以上是关于如何使用 CQS 进行读写的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 libevent 在两个端点之间进行读写的示例?

如何使用C# 进行串口的读写,请详细点

应用程序如何使用 JAR 中的文件进行读写?

应用程序如何使用 JAR 中的文件进行读写?

如何使用Java API读写HDFS

MicroBlaze如何对DDR2进行读写操作?有没有api函数可以用?用C语言如何实现对DDR2的读写?