私は最近、ドメイン駆動設計の原則を採用していますが、境界コンテキストの実装、およびコンテキストや他のシステム間の統合に少し問題があります。
たとえば、次のシステムを考えてみましょう。
倉庫/在庫管理システムエンティティには、「数量」、「場所」などのプロパティを持つ「製品」が含まれます。
オンライン注文システムエンティティには、「Order」、「OrderLine」、および「Basket」が含まれます。'Price'などのプロパティを持つ独自のProductエンティティもありますか?
注文システムの明確なビジネスルールの1つは、在庫がない製品を注文することはできないということですが、この情報は在庫管理システム内にあります。私が理解していることから、これらはこれを実装するいくつかの可能な方法です:
注文が検証されると、Orderオブジェクトは在庫管理システムのサービスを呼び出して、必要な各製品の在庫が十分にあることを確認します。ただし、ドメインが別のシステムのアプリケーションサービスを呼び出すことについて何かが正しく感じられません。また、すべてのシステムがこれを実行している場合、すべてが密接に絡み合って結合されることになります。
Ordering Systemは、Stock Keeping Systemのデータベースから読み取ります。OrderingSystemのProductエンティティは、OrderingSystemのProductテーブルとStockKeeping SystemのProductテーブルの結合にマップされます。または、OrderingSystemProductエンティティには次のものが含まれます。 StockKeepingSystemからの値を持つStockKeepingProductと呼ばれる別のエンティティ。これは検証を実行するのは簡単ですが、注文システムが在庫管理システムのデータベースに決して書き込まないようにする必要があります。
在庫の数量は注文システムのデータベースに非正規化され、在庫保持システムの在庫が変更されるたびに、注文システムにメッセージを送信して在庫を更新します。
おそらく、私は3を実行する必要があることを知っていますが、非常に多くの冗長なデータと考えられる不整合を処理する準備ができているかどうかはわかりません。1と2についてどう思いますか?または他に何か提案はありますか?