领域驱动设计.实体类型设计

本文关键字:类型 实体 | 更新日期: 2023-09-27 17:56:41

我一直在尝试了解DDD以及实体和值类型。我正在查询从实体类型中设置值类型的正确方法。在下面的"领导者"类中,我有一个"SetAddress"和"SetName"方法,这是从实体类型中更新值类型的正确方法吗?

我还有一个电话号码列表,推荐的处理方法是什么?我应该只在列表中添加一个电话号码,例如-

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;
        }
    }
}

领域驱动设计.实体类型设计

我有一个"SetAddress"和"SetName"方法,这是从实体类型中更新值类型的正确方法吗?

这取决于所建模的业务流程是什么。在 DDD 中,您通常使用无处不在的语言中的单词来命名方法。这个例子感觉很像 CRUD。当您与领域专家交谈时,他们怎么称呼这个过程?

从技术上讲,您的示例是一种方法。另一种方法是将值对象直接传递给方法,从而将概念公开给 API 的调用方。即

public void SetAddress(AddressDetails addressDetails)
{
    Address = addressDetails;
}

这样,您的域只处理域概念,并且 API 的调用者知道什么是事物(即 AddressDetails 对象,而不是一些标量值)。

我还有一个电话号码列表,推荐的处理方法是什么?

这取决于是否要公开底层存储机制,在本例中为列表。 或者,您可以使用诸如AddPhoneNumber(Phone PhoneNumber)之类的方法,这些方法将隐藏将它们存储在列表中的事实。如果更改了底层存储,则 API 可能不需要跟踪。扬子晚报.同样,正在建模的业务流程是什么?电话号码列表是域中应该公开的概念吗?还是只是其他过程需要它?(即在订单发货时发送短信之类的东西)