この問題をカプセル化したのは、変更トラッキングで、作業単位パターンです。私は自分のDDDリポジトリを作業単位に関連付けました。リポジトリのいずれかから取得したエンティティの集合に対して、作業単位を照会して変更の対象を確認することができます。
大規模なコレクションについては、読み取り専用セットのようです。これを処理する1つの方法は、これがローカルにアクセスされた場合にこれをローカルにプリロードしてキャッシュすることです。リポジトリはメモリ内バージョンに対してクエリを実行できます。私はNHibernateを使用しており、このケースを扱うのは簡単です。 の方法がRAMに保存するには大きすぎる場合(100s以上のMBなど)、データベースに対してSpecialBirthPlaces.Contains(BirthPlace)
クエリが実行されるように、おそらく特別なケースのリポジトリクエリが必要です(ストアドプロシージャ、ハ!)。文字列の大規模なコレクションではなく、エンティティのリポジトリとしてSpecialBirthPlaces
を表現したいと思うでしょう。これは、 "クエリ"パターンを使ってオブジェクト全体をロードする必要がなくなります。この長い物語の後
は、ここでいくつかの例です:それはパラメータでわかりますので、あなたは修正の誕生日に渡す方法を持つ
public class BirthPlace
{
public String Name { get; set; }
}
public class SpecialBirthPlace : BirthPlace
{
}
public class Person
{
public static readonly DateTime ImportantDate;
public BirthPlace BirthPlace { get; set; }
public DateTime BirthDate
{
get; private set;
}
public void CorrectBirthDate(IRepository<SpecialBirthPlace> specialBirthPlaces, DateTime date)
{
if (BirthPlace != null && date < ImportantDate && specialBirthPlaces.Contains(BirthPlace))
{
BirthPlace = specialBirthPlaces.GetForDate(date);
}
}
}
は、実際に出産を修正するために必要とされるものより優れたデザインですdate:SpecialBirthPlaceエンティティのリポジトリ(つまりコレクション)と正しい日付。この明示的な契約は、ドメインが何をしているのかを明確にし、エンティティの状態でコレクション全体を隠すというエンティティ契約を読むだけで、ビジネスニーズを明確にします。
エンティティにBirthPlaceを作成したので、ドメインモデルを少しフラットにする最適化がもう1つあるかもしれません。我々は実際にBirthPlace
を専門にする必要はありませんが、特別であるかどうかを示す必要があります。オブジェクトにプロパティを追加することができます(ドメインオブジェクトのプロパティを使いこなす人もいますが、特にLINQを使用するとクエリが簡単になるため)。その後、我々は完全にContains
クエリを取り除くことができます。
public class BirthPlace
{
public BirthPlace(String name, Boolean isSpecial = false)
{
Name = name;
IsSpecial = isSpecial
}
public String Name { get; private set; }
public Boolean IsSpecial { get; private set; }
}
public class Person
{
public static readonly DateTime ImportantDate;
public BirthPlace BirthPlace { get; set; }
public DateTime BirthDate
{
get; private set;
}
public void CorrectBirthDate(IRepository<BirthPlace> birthPlaces, DateTime date)
{
if (BirthPlace != null && date < ImportantDate && BirthPlace.IsSpecial)
{
BirthPlace = birthPlaces.GetForDate(date);
}
}
}
私は本当にその質問を理解していません。大きなアイテムのリスト(SpecialBirthPlaces)をキャッシュする方法や、ドメインモデルへの変更を永続化する方法を尋ねていますか? DDDの観点からは、Bounded Contextは人の誕生日と場所の周りのルールの集合であり、Person集約ルートは日付と場所を変更できるメソッドを持つ必要があります。生年月日と出生地の変更により、データストアの更新につながるイベントが発生します。私は自分自身でDDDを初めて使っているので、おそらく完全にオフになっています。 – Jason
出身地が1991年以前で、後に「サンクトペテルブルク」がある場合は、「レニングラード」を出生地として表示しようとしていましたか? –