これは長い質問なので、すぐに要点に行きます。これは、問題をよりよく説明するための疑似コードです。
DB構造
ユーザー (ユーザー ID、名前、姓)
Address(AddressID, UserID, Street, City, State, ZipCode) =>多対1のユーザー関係
電話 (PhoneID、UserID、Number、IsPrimary) => 多対 1 のユーザー関係
ドメイン クラス
class User:IEntity
{
public string Name {get;set;}
public string LastName {get;set;}
public ContactInfo{get;set;}
}
class Phone: IValueObject or IEntity? will see later.
{
public int id; // persistence ID, not domain ID
public string Number {get;set;}
}
class Address: IValueObject or IEntity? will see later.
{
public string Line1 {get;set;}
public string City {get;set;}
public string State {get;set;}
public string ZipCode {get;set;}
}
class ContactInfo: IValueObject or IEntity? will see later.
{
List<Address> Addresses {get;set;}
List<Phone> PhoneNumbers {get;set;}
}
ここまでで、このドメインとそのモデルの非常に基本的な表現ができました。
私の質問は次のとおりです。最初に入力されたときにスペルミスがあったため、アドレスの1つを更新するか、番号の1つの市外局番を修正したいとしましょう.
DDD に関する Evan のバイブルに従えば、値オブジェクトは不変でなければなりません。つまり、作成後にプロパティやフィールドを変更する必要はありません。その場合、電話番号の文字列の一部が間違っているという理由だけで ContactInfo クラス全体を再作成することはできないため、私のクラスはどれも ValueObject ではないと思います。それで、それは私のすべてのクラスをエンティティにすると思いますか?
このクラスはデータベースに格納されているため、各クラスに「永続性 ID」があることに注意してください。
コンストラクターで簡単に再作成できるため、Phone を値オブジェクトにすることにしたとします。
public Phone(string newNumber)
それで、それは User (agg root) AND contactinfo にメソッドを追加するようなものでしょうか? (デメテル法)
お気に入り...
User....
public void UpdatePrimaryPhoneNumber(string number)
{
this.ContactInfo.UpdatePrimaryPhoneNumber(number);
}
ContactInfo....
public void UpdatePrimaryPhoneNumber(string number)
{
var oldPhone = Phones.Where(p=>p.IsPrimary).Single();
var newPhone = new Phone(number, oldPhone.persistenceid???-> this is not part of the domain)
oldPhone = newPhone;
}
しかし、私はまだ永続化IDに対処する必要があります... grrrrr。なんて頭が痛い。
それらのブログを読んでいると、オブジェクトを重視するほとんどの「ddd エキスパート」が乱用されている、または誤用されていると感じることがあります。
このシナリオの最善の解決策は何ですか? ありがとうございました