Domain driven design 聚合根目录如何删除其子目录之一?

Domain driven design 聚合根目录如何删除其子目录之一?,domain-driven-design,aggregate,ddd-repositories,Domain Driven Design,Aggregate,Ddd Repositories,如果我对聚合根的理解是正确的,那么根还应该负责删除它的一个“子项”。这似乎可以转化为如下内容: order.removeOrderLine(23); 这将有效地将其从集合中移除。然而,这是如何持续的?我的ORM的UnitOfWork是否应该检测到该集合中缺少的内容,然后将其从数据库中删除 我是否应该将OrderLine作为OrderRepository的一种方法删除?您的工作单元通常应该处理这个问题,但这取决于它的实现,特别是它检测更改的方式。某些工作单元实现(即Hibernate)在您更改聚

如果我对聚合根的理解是正确的,那么根还应该负责删除它的一个“子项”。这似乎可以转化为如下内容:

order.removeOrderLine(23);
这将有效地将其从集合中移除。然而,这是如何持续的?我的ORM的UnitOfWork是否应该检测到该集合中缺少的内容,然后将其从数据库中删除


我是否应该将OrderLine作为OrderRepository的一种方法删除?

您的工作单元通常应该处理这个问题,但这取决于它的实现,特别是它检测更改的方式。某些工作单元实现(即Hibernate)在您更改聚合之前保留聚合的副本,因此在业务事务结束时(当您调用类似unitOfWork.PersistAll()的内容时),它会尝试将所有对象(和集合)的当前版本与原始版本相匹配

另一种方法是让您的域实体与您的工作单元更紧密地结合在一起,以便实体在发生更改时通知工作单元(即order.removeOrderLine方法将通知工作单元有关更改)


有多种方法可以实现UoW更改检测。看看hibernat的几个实现,从中获得灵感。

在收集更改跟踪方面,我有很好的经验,可以简单地实现自定义收集,捕获对“添加”和“删除”方法的所有调用,并将添加/删除的对象存储在2个内部“收集”中,1个用于添加项目的收集,1已删除项目的集合。UoW可以简单地询问集合发生了什么变化。