CQRS + DDD中写入模型和读取模型的通信

问题描述 投票:0回答:1

我最近学习了 DDD 和 CQRS 的 Clean 架构,我正在做我的第一个关于这个主题的项目,并且有一些不清楚的事情(尽管我已经检查过,但我找不到明确的解释)我有一些疑问,如果有人能清楚地澄清这个问题,我将不胜感激。从我的项目中,我最初得出的结论是,我需要拆分读取和写入模型,这是因为在大多数情况下它们之间存在很大差异,此外,我决定还将数据库拆分为写入数据库(使用SQL Server)和读取数据库(使用 Mongodb),这是因为非规范化以及降低查询复杂性的问题。到目前为止,我已经看到有两种选择可以在写入模型发生变化时立即更新读取模型。 1. 事件溯源。 2.领域事件。现在,第一个选项相当复杂,而且因为我在项目中第一次做的新事情已经够多了,所以我决定现在不做。第二个选项对我来说似乎相当不错,只需发送一个事件(当然,在同一事务中)并在读取模型中处理它。现在的第一个问题是,这样做真的正确吗?因为直到今天,我才明白这个领域事件只属于该领域(并且只属于同一个 BC 中的聚合之间),在这里我应该在读取模型中处理它。第二个问题:如果 1 是正确的,这是否意味着读取模型必须知道写入域(以了解其处理程序中的域事件),这是真的还是有办法打破此连接?第三件事,因为我也需要进行非规范化,并且在查询方面也有很多逻辑,所以正确的方法是制作一个项目,假设我将其称为读取模型,什么里面会是这样的: 1. 扩展名为 readmodel 的类,其数据对应于反规范化结果 + 负责反规范化过程的函数 + 如果执行反规范化后有查询逻辑,那么应该有以下函数处理这个逻辑。 2. 处理领域事件,它将接收领域事件并使用对象的函数将其反规范化为读取模型对象。 3. 毕竟,(假设到目前为止一切都很好):这里我正在辩论,因为根据我的理解,应该有许多读取模型的选项,所以我想在这里发送另一个由谁来处理的事件它实际上是 cqrs 中查询的一侧,实际上会有请求和响应 dto 类,并且一个处理程序将接收读取模型的事件,将读取模型的对象或对象插入到其特定的数据库(Mongodb)中仅与读取模型的对象的数据重叠的答案。或者我实际上会在 cqrs 中的查询一侧对读取模型项目进行引用,然后简单地在读取模型中将读取模型的数据输入到数据库中,在查询一侧我将简单地持有读取模型的数据库的对象,并将读取模型映射到查询响应,这意味着查询侧将有一侧。我真的很高兴得到解释,因为我对各种定义感到非常困惑。

我尝试阅读很多有关该主题的文章,但没有看到专门讨论它。我希望得到关于此事的明确解释

c# domain-driven-design cqrs clean-architecture
1个回答
0
投票

你的问题很复杂。首先阅读 Wiki 文章 https://en.wikipedia.org/wiki/Command%E2%80%93query_separation

您的应用程序有前端和后端。前端是命令处理,后端是数据库的接口。

CQRS 是应用程序的前端部分。前端可以使用一个或多个端口进行通信。 CQRS 建议为前端使用两个端口。一个用于命令和控制的端口。用于发送/接收数据的第二个端口。通常建议使用两个端口,因为它们更安全。数据可以与命令分开加密,从而更难被黑客攻击。

Wiki 文章讨论了读取和写入数据,这是指应用程序的前端,而不是后端。通常,数据库的后端接口将使用相同的模型进行读取和写入。不使用 SQL Server 进行写入和 MongoDb 进行读取。

© www.soinside.com 2019 - 2024. All rights reserved.