如何使用CQS进行读写

时间:2013-10-04 16:57:21

标签: entity-framework ado.net dto cqrs command-query-separation

我将开始使用CQS(作为其设计的一个方面)的新项目,但没有CQRS +事件采购,或事件流,或历史建模。当我遇到一种情况,我会有一大群人使用一小组数据(并且不想阻止用户),我将实施事件采购。这意味着(对我来说至少)我正在做的就是从查询中分离命令(关注点分离)。

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

这是我用来大致说明我的想法(它并不全面)的图表:

enter image description here

我的问题:

第1部分:我不知道 - 正确/最佳/最简单/最优化/最易维护/最容易迁移到事件源 - 在某种程度上 - 我认识到这是主观的)从中检索数据数据库(来自View)并使用ViewModels(DTO)为客户端提供某些状态的新视图(在调用命令端之后)?

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

更新

要清楚,我不打算使用Async,并且启动事务是一个优势,这只是命令和查询分离(不是完全成熟的CQRS,其中命令端只返回“void”) - 我'我正在寻找这里的基础知识。另外,从我到目前为止所读到的内容来看,似乎DDD和有界上下文与CQRS密切相关,此时我对DDD或Aggregate Root以及有界上下文没有真正的经验,到目前为止还没有看到过真正迫切需要参与这种方法/模式。此时似乎我将在命令端使用EF / Migrations,并且还没有决定在Query端使用什么(正在考虑ADO.NET)。

在我的情况下,Command端将返回一个对象,例如一个新客户,其中包含一个生成数据库的CustomerId。我将使用一个数据库用于命令和查询,并且希望在数据库中使用构建视图作为来自查询的返回模型(换句话说,我希望查询在大多数情况下“映射”到视图) 。我不知道的是,如果我要使用Query端返回Command端的数据,那么在应该返回对象的情况下Command应该如何查看。在MVC的情况下,我将尝试使用Automapper将对象转换为ViewModels。

1 个答案:

答案 0 :(得分:1)

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

首先,您要说明您不打算使用CQRS,但您提出的解决方案非常接近CQRS架构,而不是其他任何问题。作为一个初学者并尝试一种模式,但同时大量修改它会增加高度的复杂性。

基本上,为了能够使用CQS成功读写,重要的是呼叫者可以控制Id的生成。这使您可以保存对象,然后在不必依赖命令操作返回值的情况下检索它。 Guids是这方面的绝佳候选人。

另外我应该说CQS和CQRS之间存在很大的差异作为模式。 CQS是一种低级模式,您可以在几乎任何架构中应用,而CQRS是非常高级别的模式。他们分享设计理念,但没有其他的。