0

CQRS 如何处理立即一致模型的后置条件?我意识到这样的事情与最终一致的带有事件源等的系统无关。但是如果我只是想将 vanilla CQRS 应用到一个简单的界面,我将如何编写我的后置条件?CQRS 的想法是否总是假设最终的一致性?

增删改查:

IDictionary
{
   void Set(string key, object value); // Ensures: Get(key) == value
   object Get(string key);
}

CQRS:

IDictionaryQueries
{
   object Get(string key);
}

IDictionaryCommands
{
   void Set(string key, object value); // Ensures: ???
}
4

1 回答 1

2

从交易行为和边界的角度考虑它。在立即一致的模型中,Set 和 Get 将在同一个事务中执行。“事务”将确保两个接口后面的实际存储始终保持一致。这是您的保证,在调用 Set 方法后,Get 方法将返回预期值。只要实现不引入解耦机制(如消息传递),就会保持这种保证。

在最终一致性的情况下,这两个操作在不同的事务中执行,唯一的保证是最终 Get 将返回预期值。

现在在代码合同方面,我必须说我对它们不是很熟悉,我确实有点违背了 CQRS 的目的,即有一个依赖于类似查询的操作的后置条件(在命令操作上) . 可能你的后置条件不应该用Get操作的therms来表示,而更像是“命令执行成功”。这将是您在接口级别的后置条件。在实现级别,您很可能拥有实现这两个接口的相同类,您可以基于 Get 操作表达后置条件。

于 2012-09-15T04:00:46.723 回答