gpt4 book ai didi

c# - 检测聚合根内实体的变化

转载 作者:行者123 更新时间:2023-11-30 18:10:24 25 4
gpt4 key购买 nike

我正在寻找人们可能采取哪些方法来检测作为其聚合一部分的实体的变化。我有一些有用的东西,但我并不为之疯狂。基本上,我的存储库负责确定聚合根的状态是否已更改。假设我有一个名为 Book 的聚合根。和一个名为 Page 的实体聚合内。一个 Book包含一个或多个 Page实体,存储在 Pages 中收藏。

首先,插入与更新场景是通过检查聚合根及其实体以确定键的存在来完成的。如果该键存在,则假定该对象曾一度保存到基础数据源中。这使它成为更新的候选者;但对于实体而言,它并不是确定的。对于聚合根,答案是显而易见的,因为只有一个并且它是入口的奇异点,所以可以假设键的存在将决定操作。在我的情况下,再次保存聚合根本身是一个可以接受的场景,以便我可以捕获修改日期。

为了帮助实体本身促进这种行为,我的 EntityBase类包含两个简单的属性:IsUpdated() , IsDeleted() .这两个都默认为false。我不需要知道它是否是新的,因为我可以根据 key 的存在来做出决定,如前所述。实现上的方法,在本例中为 Page,将具有更改支持数据集的每个方法 IsUpdated()为真。

例如,Page 有一个名为 UpdateSectionName() 的方法。这改变了 SectionName 的支持值属性,它是只读的。这种方法被一致使用,因为它允许在执行该数据设置的方法中使用验证器的逻辑连接点(防止实体进入无效状态)。最终的结果是我必须放一个 this.IsUpdated() = true;在方法的最后。

当聚合根被发送到 Save() 的存储库中时(逻辑切换到 Insert()Update() 操作),然后它可以迭代 Pages收藏在 Book ,查找具有以下三种情况之一的任何页面:

  • 没有 key 。一个 Page没有 key 将被插入。
  • IsDeleted = true;删除胜过更新,删除将被提交 - 忽略 Page 的任何更新.
  • IsUpdated = true;将为页面提交更新。

  • 这样做可以防止我盲目地更新 Pages 集合中的所有内容,例如,如果 Book 中有数百个 Page 实体,这可能会令人生畏。我一直在考虑检索这本书的副本,并进行比较并仅提交检测到的更改(根据存在和/或比较进行插入、更新和删除),但这似乎是一种非常健谈的方法.

    主要缺点是开发人员必须记住在实体中的每个方法中设置 IsUpdated。忘记一个,它将无法检测到该值的变化。我曾考虑过某种自定义后备存储的想法,它可以透明地时间戳更改,这反过来又可以使 IsUpdated存储库可用于聚合更新的只读属性。

    存储库正在使用一个工作单元模式实现,它的操作基于将聚合根添加到它时生成的时间戳。由于可能有多个实体排队等待操作,因此在执行实体所属的聚合根操作后立即汇总并执行实体操作。我可以看到更进一步并创建另一个工作单元来处理实体操作并将它们基于实体中使用的某种事件跟踪(这就是我假设市场上的某些 ORM 产品完成类似级别的功能)。

    不过,在我继续朝着这个方向前进之前,我很想听听有关这方面的想法/建议/经验。

    编辑:一些可能有助于了解的其他信息:
  • 我正在使用的当前语言是 C#,尽管我试图保留尽可能多的特定于语言的信息,因为这更多是理论讨论。
  • 存储库/服务/实体/等的代码。基于 Tim McCarthy 在其著作“.NET Domain-Driven Design with C#”中的概念以及 CodePlex 上的支持代码.它提供了对所采用方法类型的可运行理解,尽管我正在使用的内容在很大程度上已从头开始重写。
  • 最佳答案

    简而言之,我的回答是我同意我的建议。它正在工作,尽管我确信还有改进的余地。更改实际上花费了很少的时间,所以我觉得在这种情况下我没有离 KISS 或 YAGNI 主体太远。 :-)

    我仍然觉得操作上的时间相关问题仍有空间,但我应该能够在存储库实现中解决这些问题。不是理想的解决方案,但我不确定是否值得重新发明轮子来纠正可以在比修复时间更短的时间内避免的问题。

    关于c# - 检测聚合根内实体的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1421753/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com