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

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

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

UserAggregate
- ProfileEntity
- ImageEntity
- RatingEntity

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

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

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

最佳答案

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

在这里,我描述了基本方法。我不知道您具体使用的是什么库,因此这将帮助您选择策略和评估库。

基本设计注意事项

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

快照比较

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

基于代理的变更跟踪

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

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

关于php - DDD - 仅在更改时保留聚合子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34354269/

相关文章:

php - PayPal 集成问题 : PDT hangs on return to site

php - 如何获取服务器上用户的日历信息?

python - 根据python中的自定义函数聚合数据框中的每一列

javascript - PHP 下拉列表所选值未插入数据库

php - 拉拉维尔 : seeder with foriegn keys

php - 在领域驱动设计中,存储库模式是否维护对对象的引用?

domain-driven-design - 如何使用 EventStore 在银行账户 DDD 风格之间进行资金转账?

c# - 如何通过除ID以外的其他属性查询聚合根?

r - 将“by”对象转换为R中的数据帧

mysql - 优化MySQL的聚合性能