首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AggregateRoot中的实体是否也会变成AggregateRoot

AggregateRoot中的实体是否也会变成AggregateRoot
EN

Stack Overflow用户
提问于 2018-02-17 18:51:58
回答 1查看 64关注 0票数 0

我正试图围绕DDD原则建立我的域模型。现在我有以下课程:

代码语言:javascript
复制
class Customer : AggregateRoot
{
    public string CustomerReference {get;set;}
    public string CustomerName {get;set;}
    public string List<Adult> Adults {get;set;}
    public string List<Child> Children {get;set;}
}

创建Customer是应用程序的本质,因此我将该类设置为AggregateRoot。因为很多时候,最终用户都希望通过其CustomerReference键来查找客户。

但是,有时候,最终用户希望以Child的名称进行搜索,以查找Customer信息。有时甚至以Adult的名字命名。

我不确定这是否意味着我应该让ChildAdult类也成为AggregateRoot?或者,如果我想通过一个Adult名称进行搜索,那么应该总是从Customer AggregateRoot开始搜索吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-18 04:20:35

非聚合根成员只能通过聚合根访问。

但是,如果您想要单独操作成人/儿童实体,则很可能不需要将完整的AdultChild实体作为客户根的一部分。如果是这样的话,将实体的集合替换为Id的集合,并依赖于所有需要其属性的函数都要提供完整的实体。

代码语言:javascript
复制
class Customer : AggregateRoot
{
    public string CustomerReference {get; private set;}
    public string CustomerName {get; private set;}
    public string IEnrumerable<AdultId> Adults {get; private set;}
    public string IEnrumerable<ChildId> Children {get; private set;}

    public void RegisterAnAdult(Adult adult) {...} 
    public void RegisterAChild(Child child) {...} 
}

我强调If,因为这看起来有点离谱,除非您的系统很大,AdultChild可以属于多个客户。(当一个孩子成长为成年人时,你该如何处理?)

正如@mgonzalezbaile所说,不要基于查询对域建模--搜索是一件完全不同的事情--将其建模在业务行为上。(有关更多信息,请从[http://www.zankavtaskin.com/2016/06/applied-domain-driven-design-ddd-part-7.html]开始)

最后,在您的示例中,属性是可公开设置的,如果这是有意的,那么可能值得退一步,再读几次关于DDD的文献,公共可设置属性可能允许实体移动到无效状态,这是DDD试图避免的。

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

https://stackoverflow.com/questions/48844787

复制
相关文章

相似问题

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