如何设计在DDD中保存聚合根的字段

时间:2017-02-21 02:31:24

标签: domain-driven-design

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

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

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

2 个答案:

答案 0 :(得分:1)

要坚持更改,只需要知道发生了什么变化。有两种常见的方法可以实现这一目标:

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

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

答案 1 :(得分:0)

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

如果你想更新单个字段,因为他们改变一种方法来做到这一点就是使用观察者来观察突变"在你的对象中。这种方法可以有两种操作模式"

  • Ad-hoc:当字段更新时,请立即保留此字段的值。
  • 聚合更新:收集所有更新字段的信息(只是更新它们而不是数据)。然后在时机成熟时立即更新所有内容

这种方法在大型系统中可能具有其他性能影响。你必须看看它是否适合你。

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

您实际上如何实际执行这些操作取决于您使用的语言及其实用程序。性能问题在很大程度上还取决于语言/运行时平台/第三方软件以及许多其他事情。