当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《DDD-仅在更改时保留聚合子项》经验,为你挑选了1个好方法。

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

UserAggregate
- ProfileEntity
- ImageEntity
- RatingEntity

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

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

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



1> theDmi..:

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

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

基本设计考虑因素

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

快照比较

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

基于代理的变更跟踪

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

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

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有