我们有一个复杂的聚合(由于机密性原因而被混淆的敏感名称)。使用存储库模式保存复杂聚合
根R由Ms,As,Cs,Ss的集合组成。 Ms具有其他低级细节的集合。等等等等
[R确实是一个聚集(不公平的建议我们分开吧!)
我们使用延迟加载检索细节。那里没问题。
但是我们正在为如何保存这样一个复杂的聚合而苦苦挣扎。
从查看来电者的观点:
r = repository.find(id);
r.Ps.add(factory.createP());
r.Cs[5].updateX(123);
r.Ms.removeAt(5);
repository.save(r);
我们的竞争对手的解决方案是:
脏标志 在总合计每个实体都有一个肮脏的标志。存储库中的save()方法遍历树寻找脏对象并保存它们。删除和添加有点棘手 - 特别是在延迟加载的情况下 - 但可行。
事件侦听器积累更改。 存储库订阅侦听器以进行更改并累积事件。当调用保存时,存储库抓取所有更改事件并将它们写入数据库。
放弃存储库模式。 实现重载的保存方法分别保存聚合的部分。原始示例将变为:
r = repository.find(id); r.Ps.add(factory.createP()); r.Cs [5] .updateX(123); r.Ms.removeAt(5); (r.Ps); repository.save(r.Cs); repository.save(r.Ms);
(或更糟)
建议请!我们应该做什么?
我认为你没有使用现成的ORM,它通常会为你照顾这个吗? – JasonTrue 2010-03-31 23:52:38
这是正确的。 – 2010-04-01 00:47:55