私はドメイン駆動設計に精通しておらず、最近、プロジェクトのドメイン モデルの作成を開始しました。私はまだ ORM を決定していません (ただし、NHibernate を使用する可能性があります)。現在、値オブジェクトがまさにそれであることを確認しようとしています。
たとえば、「好きな」用語をカプセル化する以外にほとんど動作のない VO がいくつかあります。
public class Referral {
public Case Case { get; set; } // this is the a reference to the aggregate root
public ReferralType ReferralType { get; set; } // this is an enum
public string ReferralTypeOther { get; set; }
} // etc, etc.
この特定のクラスには、2 レベル上の「Case」への参照があるため、Referral にアクセスする場合は、次のようにできます。ケース内にあり、ソーシャル内に単一の紹介があります)。入力しながら見ていると、Social エンティティを介してアクセスできるため、Referral に Case は必要ないと思いますよね?
さて、これが VO であるべきものであることは間違いありません。これをデータベースに永続化するために使用する予定の方法は、NHibernate にサロゲート識別子を割り当てさせることです (これについてはまだ明確ではありません)。 、誰かがそれについても詳しく説明してくれれば、それは私を助けてくれるでしょう。なぜなら、サロゲート識別子が私の VO にすでに Id を持っている必要があるのか 、それとも Id なしで動作できるのか分からないからです)および/または保護された Id プロパティこれは、Referral クラスの外部に公開されることはありません (DB に永続化するという唯一の目的のため)。
タイトルの質問に移りましょう: VO にはコレクション (私の場合はリスト) が含まれている必要がありますか? これはデータベース内の 1 対多の関係としか考えられませんが、ID がないため、クラスをエンティティにするのは適切ではないように思われました。以下はコードです:
public class LivingSituation {
private IList<AdultAtHome> AdultsAtHome { get; set; }
public ResidingWith CurrentlyResidingWith { get; set } // this is an enum
} // etc, etc.
このクラスには現在 Id がなく、AdultsAtHome クラスには固有の型 (string、int) しかありません。したがって、これがエンティティであるべきなのか、それとも VO のままでいられるのかはわかりません。独自のテーブルとプライベート/保護された Id フィールドを使用して、これに 1:m の関係を使用するように ORM を構成する必要があります。 ORM は DB に永続化できます。
また、クラスごとに正規化されたテーブルを使用する必要がありますか? エンティティまたは値オブジェクトに割り当てられたクラスの複数のインスタンスを持つ可能性がある場合、および/またはそれらのオブジェクトの一部とコレクション 1:m 関係を持つ可能性がある場合にのみ、クラスごとにテーブルを使用する必要があると思います. 固有の型を持つ特定の値オブジェクトに対して単一のテーブルを使用しても問題はありませんが、ネストされた型では、正規化されたテーブルを使用する方が有利だと思います。これについても何か提案はありますか?
複数の質問で非常に冗長になって申し訳ありません:
1) 値オブジェクトにサロゲート識別子 (NHibernate など) が必要ですか?
2) #1 が「はい」の場合、値オブジェクトが概念上値オブジェクトとして「維持」されるように、これを非公開/保護する必要がありますか?
3) 値オブジェクトは他の値オブジェクト (リストなど) を持つことができますか、それともエンティティを構成しますか? (これに対する答えはノーだと思いますが、先に進む前に確認したいと思います。)
4) 集約ルートから数レベル下の値オブジェクトから集約ルートへの参照が必要ですか? (私はそうは思いません。これは、モデルを作成する際の私の見落としである可能性があります。同意する人はいますか?)
5) ORM に単純な値オブジェクトのマッピングを行わせながら、特定のもの (入れ子になった型やコレクションを持つ型など、1:m 関係のために独自のテーブルが必要になるプロパティ) に正規化されたテーブルを使用しても問題ありませんか?私のエンティティに属する同じテーブルに?
再度、感謝します。