私はこの単純なドメインモデルを持っています。ユーザーは、長さと距離を持つアクティビティを実行します。各アクティビティには、使用される歯車アイテム(ランニングシューズ)を割り当てることができます。割り当て後、ギアアイテムの合計に期間と距離が加算されます。1つのトランザクション(DDD)で2つの集計を変更する
アクティビティとGearItemの両方が集約ルートです。アイテムをアクティビティに割り当てるとき、アイテムのIDをアクティビティに追加し、アイテムの合計を更新する必要があります。
この操作を調整するにはどうすればよいですか?
GearItem.AssignUsage()
Activity.AddItem()
から直接電話しますか?Activity.AddItem()
の直後にGearItem.AssignUsage()
を呼び出して、1つのトランザクションでアプリケーションサービスを実行します(ARごとに1つのトランザクションのルールが破られます)。- ドメインイベント(Udi Dahanの静的クラス)を使用しますが、単一のトランザクションの問題をどのように回避するか?
- 他にも、はるかに優れていますか?割り当てGearItemsのIDが含まれ、
public class GearItem: Entity<GearItem> { ... public Usage AssignedUsage { get; private set; }; public void AssignUsage(Activity activity) { AssignedUsage = new Usage(AssignedUsage.Time + activity.Time, AssignedUsage.Distance + activity.Distance, AssignedUsage.Uses + 1); } }
活性AR:
public class Activity: Entity<Activity> { ... private List<int> items = new List<int>(); public TimeSpan Time { get; } public double Distance { get; } public bool AddItem(GearItem item) { if (items.Contains(item.Id)) return false; items.Add(item.Id); return true; } }
使用値オブジェクト:
GearItem ARは、アクティビティの合計を含んでいます
public class Usage: ValueObject<Usage> { ... public TimeSpan Time { get; private set; } public double Distance { get; private set; } public int Uses { get; private set; } }