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

UserAggregate
- ProfileEntity
- ImageEntity
- RatingEntity


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

现在,我想将UserAggregate传递给UserRepository以保持持久性,例如UserRepository->save(UserAggregate)。如何告诉UserRepository UserAggregate子实体已更改,需要保存?有什么通用的模式吗?我知道UintOfWork模式,但无法真正想象它对孩子有什么帮助,因为我只想在实际更改子实体的情况下才能访问映射器(和数据库)。

有什么方法可以跟踪实体对象的“脏状态”,特别是在PHP中?还是我错过了聚合根和存储库的概念?

最佳答案

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

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

基本设计注意事项

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

快照比较

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

基于代理的变更跟踪

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

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

10-01 23:36