メンバーがアイテムに入札できるアクション Web サイトを作成したいとします。このドメインをモデル化するために、Member、Item、Bid の 3 つのクラスがあります。私のブレインストーミングは次のようになります。
- アイテムには複数の入札を含めることができます
- 入札は 1 つのアイテムと 1 つのメンバーに関連付けられます
- メンバーには複数の入札を含めることができます
- メンバーとアイテムは入札インスタンスなしで存在できます
- 入札インスタンスは、メンバーとアイテムの両方なしでは存在できません
これらすべてを考慮すると、Member オブジェクトと Item オブジェクトは独立しているため、それらを集約ルートと見なすことができることは明らかです。入札は、これらの集計の 1 つの一部になります。それは明らかですが、現在私を混乱させているのは、どの集計ルートを選択すればよいのでしょうか? アイテムかメンバーか
これは、Apress による Pro ASP.NET MVC 3 Framework ブックの例であり、彼らが行った方法は次のようなものです。
次のコードが得られます。
public class Member
{
public string LoginName { get; set; } // The unique key
public int ReputationPoints { get; set; }
}
public class Item
{
public int ItemID { get; private set; } // The unique key
public string Title { get; set; }
public string Description { get; set; }
public DateTime AuctionEndDate { get; set; }
public IList<Bid> Bids { get; set; }
}
public class Bid
{
public Member Member { get; set; }
public DateTime DatePlaced { get; set; }
public decimal BidAmount { get; set; }
}
Member と Item はここでは集約ルートであり、Bid は Item に含まれています。ここで、「特定のメンバーによって投稿されたすべての入札を取得する」というアプリケーションの使用例があるとしましょう。つまり、最初にすべてのアイテムを取得し (たとえば、リポジトリ インターフェイスを介してデータベースから)、一致するメンバーを見つけようとして各アイテムのすべての入札を列挙する必要があるということですか? ちょっと非効率じゃないですか?そのため、Bid オブジェクトを Member 内に集約することをお勧めします。しかし、その場合は、新しいユース ケースを考えてみましょう: 「特定のアイテムのすべての入札を取得する」。ここでも、すべての入札を取得するには、逆の方向に進む必要があります...
アプリケーションでこれらのユース ケースの両方を実装する必要があることを考慮すると、このドメインをモデル化するための正しく効率的な方法は何でしょうか?