CQRSプロジェクトにはNServiceBusのようなメッセージングフレームワークが必要ですか?
簡単な答え:いいえ。
eulerfxが言及した「read-modelpattern」について聞いたのは初めてです。これは十分に良い名前ですが、もう少しあります。
'query'部分の背後にある一般的な考え方は、データの非正規化ビューをクエリすることです。「read-modelpattern」リンクでは、read-modelにデータを入力するために使用されるクエリがある程度のリフティングを行っていることに気付くでしょう。上記の例では、必要なデータ操作はそれほど複雑ではありませんが、さらに複雑になった場合はどうなりますか?これが非正規化の出番です。「コマンド」の部分を実行するとき、次のアクションはデータを非正規化し、読みやすいように結果を保存することです。すべての面倒な作業は、ドメインが行う必要があります。
これがあなたがメッセージについて尋ねている理由です。ここにはいくつかのテクニックがあります:
- 同じデータベース、同じテーブル、異なる列の非正規化データ
- 同じデータベース、異なるテーブル内の非正規化データ
- 別のデータベースの非正規化データ
それがストレージです。一貫性はどうですか?:
最も簡単な解決策(クイックウィン)は、ドメイン内のデータを非正規化し、リポジトリを介してドメインオブジェクトを保存した後、すぐに非正規化されたデータを同じデータストア、同じテーブル、異なる列に保存することです。100%一貫しており、非正規化されたデータの読み取りをすぐに開始できます。
本当に必要な場合は、そのデータを転送するための個別のオブジェクトの束を作成できますが、データアクセスフレームワークによって提供されるデータを運ぶオブジェクトを返す単純なクエリレイヤーを作成する方が簡単です(.Netの場合はDataRow
/になりますDataTable
)。絶対に空想する理由はありません。常に例外がありますが、それから先に進んでデータコンテナを書くことができます。
結果整合性を得るには、何らかの形式のキューイングと関連する処理が必要になります。独自のソリューションを展開することも、サービスバスを選択することもできます。それはあなたとあなたの時間/技術的制約次第です:)
ところで:私はここに無料のオープンソースサービスバスを持っています:
どんなフィードバックでも歓迎されます。ただし、古いサービスバス(MassTransit / NServiceBusなど)でもかまいません。
お役に立てば幸いです。