我一直在尝试了解DDD以及实体和值类型。我正在查询从实体类型中设置值类型的正确方法。在下面的"领导者"我有一个" SetAddress"和" SetName"方法,这是从实体类型中更新值类型的正确方法吗?
另外我有一个PhoneNumbers列表,推荐的方法是什么?我应该只将PhoneNumber添加到列表中,例如 -
leader.PhoneNumbers.Add(new PhoneNumber("12345", Mobile);
感谢您的帮助:
public class Leader:Entity
{
public void SetName(string firstName, string surname)
{
Name = new Name(firstName, surname);
}
public Name Name { get; private set; } = Name.Empty;
public void SetAddress(string street, string city, string postode)
{
Address = new AddressDetails(street, city, postode);
}
public AddressDetails Address { get; private set; } = AddressDetails.Empty;
public List<Phone> PhoneNumbers { get; set; }
}
public class AddressDetails : ValueObject<AddressDetails>
{
public static readonly AddressDetails Empty = new AddressDetails(string.Empty, string.Empty, string.Empty);
public AddressDetails(string street, string city, string postode)
{
Street = street;
City = city;
Postcode = postode;
}
public string Street { get; }
public string City { get; }
public string Postcode { get; }
protected override bool EqualsCore(AddressDetails other)
{
return Street == other.Street &&
City == other.City &&
Postcode == other.Postcode;
}
protected override int GetHashCodeCore()
{
unchecked
{
int hash = 17;
hash = (hash * 23) ^ Street.GetHashCode();
hash = (hash * 23) ^ City.GetHashCode();
hash = (hash * 23) ^ Postcode.GetHashCode();
return hash;
}
}
}
答案 0 :(得分:1)
我有一个&#34; SetAddress&#34;和&#34; SetName&#34;方法,这是从实体类型中更新值类型的正确方法吗?
这取决于所建模的业务流程是什么。在DDD中,您通常会使用泛在语言中的单词命名方法。这个例子感觉非常像CRUD。当您与域专家交谈时,他们称之为流程?
从技术上讲,你的例子是一种方法。另一种方法是将值对象直接传递给方法,从而将概念暴露给API的调用者。即
public void SetAddress(AddressDetails addressDetails)
{
Address = addressDetails;
}
通过这种方式,您的域只处理域概念和API的调用者知道什么是事物(即AddressDetails对象,而不是某些标量值)。
我还有一个PhoneNumbers列表,推荐的处理方式是什么?
这取决于您是否要公开底层存储机制,在本例中是否为List。或者你可以使用像AddPhoneNumber(Phone phoneNumber)这样的方法来隐藏你将它们存储在List中的事实。如果您更改了底层存储,则API可能不需要更改。因人而异。同样,建模的业务流程是什么?电话号码列表是域中应该公开的概念吗?或者它只是需要其他一些过程? (即发送订单时发送短信等内容)