DDD では、集約ルートにリポジトリを含めることができます。Order集約を取りましょう。これは、非永続的な対応するOrderRepositoryと永続的な対応するOrderUoWです。また、注文された製品の在庫を追跡するProductVariant集約もあります。ProductVariantRepositoryとProductVariantUoWを持つことができます。
Order と ProductVariant が機能する方法は、注文が永続化される前に、在庫がチェックされるというものです。在庫がある場合、注文は OrderUoW.Commit() を呼び出すことによって保持されます。はい、ProductVariantUoW.Commit() が次に呼び出され、製品の在庫が更新されます。
残念なことに、ユーザーが同じ製品を短時間で購入した場合、事態は悪化する可能性があります (これを、2 人のユーザーが同じ製品を購入している Web アプリと考えてください)。これで、2 番目のユーザーのトランザクション全体が、作成したばかりの注文を元に戻すことによって失敗するはずです。OrderUoW を呼び出して変更をロールバックする必要がありますか (注文はデータベースから削除する必要があります)。または、両方の UoW.Commit() 操作をトランザクション スコープに配置して、1 つの commit() が失敗すると変更がロールバックされるようにする必要がありますか? それとも、両方のリポジトリ (Order、ProductVariant) に UoW のみが必要で、トランザクション スコープが 1 つだけ必要ですか?
複数のリポジトリが関係する場合、トランザクションはどのように処理されるのでしょうか?