質問: DDDとクリーンアーキテクチャでシステムを設計しているのですが、マスタテーブルに永続化されているValueObjectの扱いについて困っています。 ProductEntity{id,name,price,rank} があります。rankはpriceの値を元に決められます。 DB的にはランクテーブルがあり、基準価格とその基準でのランクを保持しています。 (例 0円以上はランクA、5000円以上はランクB、10000円以上はランクC) 既に永続化されている状態から、priceを元にrankを探すのはProductRepositoryが行えるので問題ありません。 問題となるのは、Productを生成するFactoryでランク情報が取得できない点です。 新規商品を追加する際に、外部からinputされる情報はnameとpriceのみです。 ユースケースではValueObjectであるRankを直接取得できないためProductEntityが生成できません。 RepositoryやServiceは外部のデータを引数に取ることはできない=ドメインモデルを引数に取るということで、新規Entityを作成し、それを永続化するという部分が実装できません。 このような場合はなにかうまい実装方法があるのでしょうか? それとも設計がおかしいのでしょうか?
回答: クリーンアーキテクチャのルールに疎いせいか、何が制約になっているのかがいまいち掴みきれていませんが、私ならこんな風に設計するということで・・・ まず、Priceを元にRankを決定するのはドメインの知識なので、ドメインモデル化します。 ここではRankPolicyエンティティとしましょう。 ``` RankPolicy + calculateRank(price: Price): Rank RankPolicyRepository + get(): RankPolicy ``` まず先に、RankPolicyRepositoryからRankPolicyを取得しておきます。 そして、ProductFactoryにこのRankPolicyを渡して、ProductFactoryの中からRankPolicy#calculateRank()を呼び出し、ランクを求めます。