Company
アプリケーションでは、エンティティおよびAddress
値オブジェクトとしてモデル化しました。
public class Company : Entity {
public Address PrimaryAddress { get; set; }
public Address SecondaryAddress { get; set; }
}
public class Address : ValueObject {
public string ZipCode { get; private set; } // etc.
public Address(string zipCode) {
ZipCode = zipCode;
}
}
ここでAddress
は、ID を持たず、不変です。会社の を更新するには、新しいオブジェクトPrimaryAddress
に置き換えます。Address
しかし、ドメインをさらに詳しく調べたところ、ある企業のアドレスの数はさまざまであることがわかりました。それらを個々のプロパティとして表すことは、もはや実現不可能でした。そこで、リファクタリングしましたCompany
:
public class Company : Entity {
public Address[] AddressBook { get; set; }
}
現在、会社の をどのように更新するかという問題がありますAddress
。アドレスの IDを気にするようになりましたが、これは Company のコンテキスト内でのみです。
リファクタリング後、最終的には次のようになります。
public class Company : Entity {
public Address[] AddressBook { get; set; }
public void UpdateAddress(Address newAddress) {
var oldAddress = AddressBook.FirstOrDefault(a => a.Id == newAddress.Id);
if (oldAddress != null)
oldAddress = newAddress;
}
}
public class Address : ValueObject {
public Guid Id { get; private set; }
public string ZipCode { get; private set; } // etc.
public Address(Guid id, string zipCode) {
ZipCode = zipCode;
Id = id;
}
}
// usage
var company = repo.Load<Company>(companyId);
var address = new Address(model.Id, "12345"); // uses id of address we are replacing
company.UpdateAddress(address);
repo.Save(company);
アドレスを更新するには、そのアドレスを使用して検索し、同じIDId
を持つ新しいアドレス オブジェクトに置き換えます。
- したがって、Address はまだ値オブジェクトですか?
- 更新された Address に同じIdを使用するのは正しいのでしょうか、それとも定義上 (値オブジェクトとして) Id を置き換える必要があるのでしょうか。
- Address が Company エンティティのコンテキスト内でのみ ID を持つ場合、これをモデルで明示し、おそらくエンティティ内でのみ一意の ID を生成する必要があります (計算の一部としてエンティティの ID を使用する可能性があります)。