将CQRS应用于传统数据库,但不保证数据完整性?

时间:2017-08-21 23:38:59

标签: repository domain-driven-design cqrs

我们目前无法从旧版数据库迁移,因此我们将其置于存储库之后并处理域部分。相同的DB将用于读取和写入部分,我们也不使用事件源。

我的困境是如果当前数据无效,因为它没有首先通过域逻辑?因此,我们有可能使用ReadModels向客户端发送不一致的数据,这在我们的案例中是不可接受的。一些想法:

  • 添加一些验证步骤,以确保所有数据在使用之前至少通过WriteModels处理一次。
  • 为ReadModels添加一些验证? (会导致代码重复)。
  • 使用Write Models查询数据? (会打破CQRS的想法)。
  • 不要使用CQRS并坚持使用DDD,其中读取结果将从域不变量构建,以确保我们不会向客户端传递任何不一致的数据。谢谢!

1 个答案:

答案 0 :(得分:0)

  

我的困境是如果当前数据无效,因为它没有首先通过域逻辑?

好消息:这里的答案并不取决于您是使用遗留数据库,简单的CQRS方法还是全金属事件采购。

  

为ReadModels添加一些验证? (会导致代码重复)。

这是正确的答案。

我认为你发现的重复是一种错觉。

主要思想:首先,不共享不一致数据的决定是读取模型的本地决策。您的代码应该以这样的方式编写,即您可以在读取模型中更改该决策,而不会以任何方式影响写入模型

Parnas的

On the Criteria to be Used in Decoupling Systems into Modules是一个很好的起点。

第二:读模型和写模型共同具有 state 的概念。这是存储在数据库中的内容,在模型中表示为值。读模型和写模型没有理由不共享用于验证状态的实现。