首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >领域驱动设计。实体型设计

领域驱动设计。实体型设计
EN

Stack Overflow用户
提问于 2016-07-12 04:27:35
回答 1查看 91关注 0票数 0

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

另外,我有一个PhoneNumbers列表,建议如何处理这个问题?我应该在名单上加上一个PhoneNumber吗?

代码语言:javascript
运行
复制
leader.PhoneNumbers.Add(new PhoneNumber("12345", Mobile);

谢谢你的帮助:

代码语言:javascript
运行
复制
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;
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-12 06:41:06

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

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

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

代码语言:javascript
运行
复制
public void SetAddress(AddressDetails addressDetails)
{
    Address = addressDetails;
}

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

另外,我有一个PhoneNumbers列表,建议如何处理这个问题?

这取决于您是否要公开底层存储机制,在本例中,是否公开列表。或者,您可以使用像AddPhoneNumber(Phone phoneNumber)这样的方法来隐藏将它们存储在列表中的事实。如果您曾经更改过底层存储,那么API可能不需要查询。YMMV同样,正在建模的业务流程是什么?电话号码列表是否是应该公开的领域中的一个概念?或者仅仅是其他过程所需要的?(例如,在发出订单时发送短信)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38320021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档