DDD - 仅在更改时保留聚合子项

时间:2015-12-09 10:23:00

标签: php domain-driven-design aggregate repository-pattern

我正在尝试在我正在使用的应用程序中使用DDD。 我有一个以下UserAggregate结构:

UserAggregate
- ProfileEntity
- ImageEntity
- RatingEntity

我有一个UserRepository,它正在查询实体映射器以构建UserAggregate。

现在我想将UserAggregate传递给UserRepository以保持持久性,例如UserRepository->save(UserAggregate)。如何告诉UserRepository UserAggregate子实体已更改并需要保存?那有什么共同的模式吗?我知道UintOfWork模式,但无法想象它对孩子们有什么帮助,因为我只想在子实体实际上遇到mappers(和数据库)改变

有没有办法跟踪"脏状态"实体对象,特别是在PHP中?或者我错过了聚合根和存储库的概念?

1 个答案:

答案 0 :(得分:6)

这个问题基本上有两种方法。您可以使用快照比较基于代理的更改跟踪。它们都有优点和缺点。选择还取决于您使用的库,因为它们可能支持其中一个库。

在这里,我描述了基本方法。我不知道您正在使用哪些库,因此这将有助于您选择策略并评估库。

基本设计注意事项

这两种策略都是持久性机制的责任,不得泄漏到域和应用程序逻辑中。换句话说,它们必须对存储库的用户和域对象透明。

快照比较

使用此策略,可以在通过存储库加载聚合时保留聚合数据的快照。稍后,当可能修改的聚合再次在Update调用存储库中传递时,您可以遍历聚合以确定其中的数据是否发生了更改。

基于代理的更改跟踪

使用此策略,您将返回一个代理实际聚合而不是聚合本身的对象。创建代理并用于在通过存储库加载聚合时包装聚合。

代理对聚合的读取操作不执行任何操作,但每当调用变异操作时都会设置脏标志。当(代理)聚合传递到存储库以进行持久化时,您只需检查脏标志。