0

CQRS は、すぐに一貫性のあるモデルの事後条件をどのように処理しますか? このようなことは、イベント ソーシングなどを使用した最終的に一貫性のあるシステムでは無関係であることに気付きました。しかし、バニラ 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 は同じトランザクションで実行されます。「トランザクション」は、2 つのインターフェイスの背後にある実際のストレージが常に一貫していることを保証します。これにより、Set メソッドを呼び出した後、Get メソッドが期待値を返すことが保証されます。この保証は、実装がメッセージングなどの分離メカニズムを導入しない限り維持されます。

結果整合性では、2 つの操作が異なるトランザクションで実行されます。唯一の保証は、最終的に Get が期待値を返すことです。

コード コントラクトの点では、私はそれらにあまり精通していないと言わざるを得ませんが、クエリのような操作に依存する事後条件 (コマンド操作で) を持つという CQRS の目的を無効にします。 . おそらく、事後条件は Get 操作の条件で表現するのではなく、「コマンドが正常に実行されました」のように表現する必要があります。これは、インターフェイス レベルでの事後条件になります。両方のインターフェースを実装する同じクラスを持つ可能性が最も高い実装レベルでは、Get 操作に基づいて事後条件を表現できます。

于 2012-09-15T04:00:46.723 に答える