在域驱动设计中,是允许具有部分值的实体的集合属性吗?
例如,Customer.Orders,Post.Comments,Graph.Vertices等属性是否应始终包含所有订单,注释,顶点或允许其包含今日订单,最近评论,孤立顶点?
相应地,Repositories应该提供类似
的方法GetCustomerWithOrdersBySpecification
GetPostWithCommentsBefore
等?
答案 0 :(得分:1)
我不认为DDD告诉你做或不做。它在很大程度上取决于您正在构建的系统以及您需要解决的具体问题。
我甚至没有听说过关于此的模式。
从主观的角度来看,我会说实体应该通过定义完成(考虑延迟加载),并且可以完全或部分地加载到DTO,以优化发送给客户端的数据量。但我不介意从数据库加载部分实体,如果它可以解决一些问题。
答案 1 :(得分:1)
请记住,域驱动设计还有服务的概念。对于执行某些数据库查询,最好将问题建模为服务,而不是作为附加到父对象的子对象的集合。
这方面的一个很好的例子可能是通过接受几个用户输入的参数来创建报告。将其建模为更容易:
CustomerReportService.GetOrdersByOrderDate(Customer theCustomer, Date cutoff);
比这样:
myCustomer.OrdersCollection.SelectMatching(Date cutoff);
或者换句话说,用于数据输入的DDD模型不必与用于报告的DDD模型相同。
在高度可扩展的系统中,将这两个问题分开是很常见的。