这是一个很长的问题,所以我要直奔主题。这是为了更好地说明问题的伪代码
数据库结构
用户(用户 ID、姓名、姓氏)
地址(AddressID, UserID, Street, City, State, ZipCode) =>多对一用户关系
Phone (PhoneID, UserID, Number, IsPrimary) =>多对一用户关系
领域类
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;}
}
所以,到目前为止,我们对这个领域及其模型有了一个非常基本的表示。
我的问题如下。假设我想更新其中一个地址或修复其中一个数字的区号,因为最初输入的 wnen 拼写错误。
如果我遵循 Evan 关于 DDD 的圣经,值对象应该是不可变的。意思是,在创建后不会更改其属性或字段。如果是这种情况,那么我想,我的所有类都不是 ValueObject,因为我不能仅仅因为电话号码中字符串的一部分错误就重新创建整个 ContactInfo 类。所以,我想这使我所有的类实体?
请记住,我对每个此类都有一个“持久性 ID”,因为它们存储在数据库中。
假设我决定让 Phone 成为一个值对象,因为它很容易在构造函数中重新创建
public Phone(string newNumber)
所以,这就像向用户(agg root)和联系人信息添加一个方法?(得墨忒耳定律)
像...
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 专家”认为价值对象被过度使用,或者我会说被滥用。
这种情况的最佳解决方案是什么?谢谢