最近私はDDDを探し始め、このパターンに古い個人プロジェクトをリファクタリングしています。私はエヴァンスの青い本の途中から来ていて、どこにいてもそこの答えが見つからないようです。DDD Repo-repo.findByChildId(id)AND repo.transferChild(to、from、child)
基本的に私のアプリケーションは在庫追跡システムです。インベントリにはアイテムのコレクションが含まれ、アイテムはインベントリ間の移転可能なエンティティです。在庫はtransferIn() transferOut()
のようないくつかの検証論理を含む方法、すなわち在庫がまだ満杯でないか、または項目が移送可能状態にあるかをチェックする方法を有する。これらの制約は、在庫が総ルートであり、そのアイテムが実体であると私に信じさせます。
1)ある時点で、ユーザーが在庫に対して特定の商品エンティティをリクエストした場合、その商品を現在持っている在庫を返すinventoryRepo.findByItemId(id)
があります。私ができるように:
2)のような何かを:
基本的に在庫のクラス(リッチドメインモデル)で私の検証ロジックを書いboolean requestItemTransfer(destInvId, itemId){
Inv from = invRepo.findByItemId(itemId);
Inv to = invRepo.findById(destInvId);
from.transferOut(itemId);
to.transferIn(from.getItem(itemId));
return invRepo.transferChild(to, item); //Edited
}
と例外がない場合、私はレポを使用.transfer()メソッドを使用して変更を保持します。
私はDDDに違反しますか?より良い選択肢はありますか?
私が読んで理解したことから、これは慣習的でない場合に有効と思われます。私が見つけたすべての例は、1つのルートインスタンス内にしか存在できないエンティティを示しています。銀行口座振替の例もありますが、価値オブジェクトである金額を扱うものと、振替リポジトリがあるのは、転送が特定のシナリオで記録されるため、私のものではないからです。
EDIT: ユースケースは以下の通りです:
1)ユーザーが自分の在庫とその項目のリストを要求します。
2)ユーザーは1つの在庫から1つ以上のアイテムを選択し、別の在庫に送るように要求します。これは、私のTransferServiceが来て、指定されたインベントリからtxInとtxOutを調整し、それらの変更をリポジトリを通じて保持する場所です。多分それはインフラストラクチャサービスでなければなりませんか?それは私が明確ではない1つのことです。
3)ユーザは、それらのアイテムが現在存在する在庫の在庫に関して、在庫に転送できるようにしたいアイテムのセットを事前定義します。TransferServiceは、ユースケース2のように、 。
EDIT2: repo.transferについて これは実際には制約/最適化ですか?データ側から、私が言ったことは、アイテムを検索し、それが指し示すインベントリIDを変更することだけです。これは、アイテムを一度に2つのインベントリに入れることができないためです。だからrepo.update(fromInvInNewState)
とrepo.update(toInvInNewState)
の代わりに、repo.moveChild(toInv, child)
があります。私たちは在庫の全状態(移動していないすべてのアイテムと、それ以外の状態はそれが持っているアイテムから派生しているためポイント)、いくつかのアイテムを動かすだけです。
ちょうどエヴァンスとヴァーノンの本を終えた。私はあなたの反応に同意しますが、別の質問が浮上しました。私はユーザーがARでありインベントリインスタンスの不変条件を処理することに同意します。問題は今、いくつかのインベントリがユーザ間で共有されていることです。チームには共通の在庫があり、各メンバーにはそれぞれ独自の在庫があるとします。したがって、フローはUser1がアイテムを共通インベントリに転送し、User2がアイテムを共通インベントリから取得します。エンティティインスタンスはそのような集約全体で共有できますか?それとも、私はチームをモデル化すべきですか?誰がtransfer()メソッドをホストしていますか? – jam01
一般的な在庫をユーザー転送方法に渡すことはありますか? – jam01