

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を作成し、それを永続化するという部分が実装できません。

このような場合はなにかうまい実装方法があるのでしょうか？  
それとも設計がおかしいのでしょうか？


CC BY-SA 3.0
2016-08-09T14:05:03.100
28162
2016-11-27T05:04:47.153
14501
question
ドメイン駆動設計 アーキテクチャ
DDD(ドメイン駆動設計)における、マスタ情報の扱い


クリーンアーキテクチャのルールに疎いせいか、何が制約になっているのかがいまいち掴みきれていませんが、私ならこんな風に設計するということで・・・

まず、Priceを元にRankを決定するのはドメインの知識なので、ドメインモデル化します。  
ここではRankPolicyエンティティとしましょう。

[code]

    RankPolicy
     + calculateRank(price: Price): Rank
    
    RankPolicyRepository
     + get(): RankPolicy
    
[/code]

まず先に、RankPolicyRepositoryからRankPolicyを取得しておきます。  
そして、ProductFactoryにこのRankPolicyを渡して、ProductFactoryの中からRankPolicy#calculateRank()を呼び出し、ランクを求めます。


CC BY-SA 3.0
2016-08-10T01:52:42.453
28166
2016-08-10T01:52:42.453
8078
28162
answer