我正试图围绕DDD原则建立我的域模型。现在我有以下课程:
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的名字命名。
我不确定这是否意味着我应该让Child和Adult类也成为AggregateRoot?或者,如果我想通过一个或Adult名称进行搜索,那么应该总是从Customer AggregateRoot开始搜索吗?
发布于 2018-02-18 04:20:35
非聚合根成员只能通过聚合根访问。
但是,如果您想要单独操作成人/儿童实体,则很可能不需要将完整的Adult和Child实体作为客户根的一部分。如果是这样的话,将实体的集合替换为Id的集合,并依赖于所有需要其属性的函数都要提供完整的实体。
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,因为这看起来有点离谱,除非您的系统很大,Adult和Child可以属于多个客户。(当一个孩子成长为成年人时,你该如何处理?)
正如@mgonzalezbaile所说,不要基于查询对域建模--搜索是一件完全不同的事情--将其建模在业务行为上。(有关更多信息,请从[http://www.zankavtaskin.com/2016/06/applied-domain-driven-design-ddd-part-7.html]开始)
最后,在您的示例中,属性是可公开设置的,如果这是有意的,那么可能值得退一步,再读几次关于DDD的文献,公共可设置属性可能允许实体移动到无效状态,这是DDD试图避免的。
https://stackoverflow.com/questions/48844787
复制相似问题