0

CQRS如何在立即一致的模型上處理後置條件?我意識到這樣的事情在最終一致的系統(事件採購等)上是無關緊要的。但是如果我只想將vanilla CQRS應用於一個簡單的界面,我將如何編寫我的後置條件? CQRS的想法總是假定最終的一致性?如何使用CQRS實現後置條件?

CRUD:

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: ??? 
} 

回答

2

想想它的事務行爲和邊界克卡。在立即一致的模型中,Set和Get將在同一個事務中執行。 「事務」將確保兩個接口背後的實際存儲將始終保持一致。這是您保證在調用Set方法之後,Get方法將返回期望值。只要實現不引入解耦機制(如消息傳遞),就會保留此保證。

最終的一致性是兩個操作在不同的事務中執行,唯一的保證是Get最終將返回預期的值。

現在在代碼合同中,我必須說我對他們不是很熟悉,我的確有點失敗了CQRS的後置條件(在Command操作上)的目的,它依賴於類似Query的操作。也許你的後置條件不應該在Get操作的時候表達,但更像是「命令執行成功」。這將是您在界面級別的後置條件。在實現級別,你很可能會有相同的類來實現這兩個接口,你可以基於Get操作來表達發佈條件。