【问题标题】:How does an aggregate root delete one of its children?聚合根如何删除它的一个子节点?
【发布时间】:2010-12-16 01:21:04
【问题描述】:

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

order.removeOrderLine(23);

这将有效地将其从集合中删除。然而,这是如何持续存在的?我的 ORM 的 UnitOfWork 是否应该检测到该集合中缺少某些内容,然后将其从数据库中删除?

我应该用 removeOrderLine 代替 OrderRepository 的一个方法吗?

【问题讨论】:

    标签: domain-driven-design aggregate ddd-repositories


    【解决方案1】:

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

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

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

    【讨论】:

    • 在集合更改跟踪方面,我在简单地实现自定义集合方面有很好的经验,该集合捕获对“添加”和“删除”方法的所有调用并将添加/删除的对象存储在 2 个内部“集合中" - 添加项目的 1 个集合,已删除项目的 1 个集合。然后,UoW 可以简单地询问收藏品发生了什么变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2016-10-11
    相关资源
    最近更新 更多