【问题标题】:How to design to save a field of a aggregate root in DDD如何设计在 DDD 中保存聚合根的字段
【发布时间】:2017-07-10 12:06:12
【问题描述】:

我最近学习了DDD,我们曾经将创建,更新,删除封装到存储库中以将更改持久化到数据库中。

使用ORM工具,我们可以忽略持久化的细节,通常repository的参数是一个聚合根对象,ORM执行持久化的转换(例如,如果只有一个字段,它会更新一个字段改变)。

但是如果没有ORM,只是聚合根对象的一个​​字段被改变并保存到DB,如何为存储库设计这个?支持保存该字段的方法吗?有一个叫 update 的方法可以保存所有属性,但是使用它会导致性能问题。

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

    显然,要持久化更改,您只需要知道发生了什么变化。有两种常见的方法来实现这一点:

    1. 跟踪发生的变化。当实体明确参与更改跟踪机制时,此策略更易于实施。例如,使用Event Sourcing,聚合根将record uncommitted change event(s) 在它处理的所有命令的集合中。

    2. 脏检查:将新状态与旧状态进行比较。请注意,可能会缓存旧状态以进行性能优化。

    【讨论】:

    • @RonSmith 你忘了你的问题了吗?
    【解决方案2】:

    通常您需要另一个存储库。如何实施取决于您。 您可以编写代码,以便在更改时仅保存/更新单个字段。

    如果您想在单个字段更改时更新它们,一种方法是使用 Observer 来“观察对象中的突变”。这种方法可以有两种“操作模式”

    • Ad-hoc:当一个字段得到更新时,只保留这个字段的值。
    • 聚合更新:收集所有更新字段的信息(只是它们被更新的事实而不是数据)。然后在时机成熟时立即更新它们

    这种方法在大型系统中可能会产生其他性能影响。你得看看它是否适合你。

    另一种选择是让您的 ORM 在更新时通过比较识别更改的字段。这同样有其自身的性能影响,因为您必须再次获取 DB 对象(聚合)并将其与运行时更改进行比较。

    您如何实际实现这些在很大程度上取决于您使用的语言及其实用程序。性能问题还很大程度上取决于语言/运行时平台/第 3 方软件和许多其他因素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 2019-07-11
      相关资源
      最近更新 更多