如果我对聚合根的理解是正确的,那么根也应该负责删除它的一个“孩子”。这似乎会转化为这样的东西:
order.removeOrderLine(23);
这将有效地将其从集合中删除。然而,这是如何持续存在的?我的 ORM 的 UnitOfWork 是否应该检测到该集合中缺少某些内容,然后将其从数据库中删除?
我应该用 removeOrderLine 代替 OrderRepository 的方法吗?
如果我对聚合根的理解是正确的,那么根也应该负责删除它的一个“孩子”。这似乎会转化为这样的东西:
order.removeOrderLine(23);
这将有效地将其从集合中删除。然而,这是如何持续存在的?我的 ORM 的 UnitOfWork 是否应该检测到该集合中缺少某些内容,然后将其从数据库中删除?
我应该用 removeOrderLine 代替 OrderRepository 的方法吗?
您的工作单元通常应该注意这一点,但这取决于它的实现,特别是它检测更改的方式。某些工作单元实现(即 Hibernate)在您更改聚合之前保留了聚合的副本,因此在业务事务结束时(当您调用 unitOfWork.PersistAll() 之类的东西时),它会尝试匹配所有对象的当前版本(和集合)对原始版本。
另一种方法是让您的域实体与您的工作单元更加耦合,以便实体在发生更改时通知工作单元(即 order.removeOrderLine 方法将通知工作单元有关更改)。
有多种方法可以实现 UoW 更改检测。查看 hibernat 的几个实现以获得灵感。