2016-05-20 6 views
1

CreateItemというコマンドがあり、作成するアイテムの名前(集約ルート)があります。今私は、すべてのアイテムが一意に命名されなければならないというビジネスルールを持っています。CQRSとイベントソースを使用してビジネスルールを検証するためのデータのロード

イベントソーシングを使用している場合は、書き込みモデルからこれを調べる方法がないため、と考える必要があります。は、すべての名前を含む表になります「アイテム」はItemCreatedイベントに基づいて最新の状態に保たれます。

CreateItemコマンドを処理するコードでは、このテーブルをチェックするのが大丈夫です(クエリで行う必要がありますか?)。最終的な一貫性があれば、このデータは古くなっている可能性があるので、どうすればよいでしょうか?

+1

参照:http://stackoverflow.com/questions/9495985/cqrs-event-sourcing-validate-username-uniqueness –

+0

参照:http://programmers.stackexchange.com/questions/318705/ – VoiceOfUnreason

+0

も参照してください。 :http://programmers.stackexchange.com/questions/318967 – VoiceOfUnreason

答えて

3

今私はすべての項目が一意にあなたがセットの検証と呼ばれる問題空間の中に入力した

を命名しなければならないと言うビジネスルールを持っています。つまり、何かをする前に、このエッセイをGreg Youngで読む必要があります。

最終的な整合性は、このデータが最新ではない可能性があるので、どうすればよいですか?

私は要件を変更する、と言うことです結果整合性を受け入れ

の知っている唯一の3の答えがあります。 (「集約ルート」の由来)の約束は、モデルをビジネスに合わせるだけでなく、実際の要件と想像されたものを分離し、代替の実装を探索する戦略も持っています。モデルだけでなく、ビジネス自体の

一意性制約の場合、集約が一意性をチェックするために誠実な努力をし、(イベントストリームの読み取りに基づいて)重複した報告を可能にするプロセスがあり、モデルが重複した名前をすべて拒否することが本当に重要なのでしょうか?

あなたのモデルが問題の財産を担当していることも明確にする必要があります。あなたのモデルはで、その名前はと決めていますか、または他の誰かが決定を下したという通知を受けていますか?後者の場合は、コマンドではなくイベントについて話しているので、別の戦略(プロセスマネージャ、別名ダウンストリームイベントプロセッサ)が必要です。

ビジネスルールを移動リレーショナルデータベースは本当に良いですセット検証で。イベント・ストアがリレーショナル・データベースである場合、イベントを持続させる同じトランザクション内の列制約を持つユーザー名表にユーザー名を書き込みます。ドメインの知識がモデルから漏洩しています。これにはいくつかのネガティブなものがあります。イベント履歴を複数のデータベースに統合する機能が失われます。

理論上、リレーショナル・データベースは、2つのフェーズ・コミットを調整してイベント・ストアから分離することができます。私はまだシナリオを説明している当局を見つけることができませんでした。

集約境界を変更するセットでトランザクションの一貫性が必要な場合、セットはドメインモデルの一部であり、集約の境界内で表現する必要があります。たとえば、 "ItemCatalog"おそらく。ドメイン専門家によるユビキタス言語の調査は、この制約の原因となる新しい集約を発見するのに役立ちます。

アイテムの動作が名前に強く結びついている場合(現在の名前が母音で始まる場合、アイテムのDoubleThePriceしかできないというビジネスルールがあります)、Itemエンティティ自体はそのアイテムの一部になる必要があります。同じ集約であり、異なるコンテキストに対する同時編集での競合を受け入れる必要があります。

ビジネス制約を正しいモデルで実装するかどうか、つまり正しい境界条件を念頭に置いてください。たとえば、マーケティング部門は、倉庫が気にしない品目名の一意性について多くのことを気にするかもしれません。これはあなたがユビキタス言語の変化を見逃していることを示唆しています。覚えておいてください。コンセプトがビジネスのさまざまな部分と異なることを意味する場合、異なるモデルが想定されます。

関連する問題