让实体调用存储库存储方法是否正确?

时间:2010-11-11 11:42:21

标签: domain-driven-design

例如,如果我有2个聚合根AR1和AR2,并且AR1以某种方式更新AR2 - 在存储库中存储该更改的正确方法是什么? AR1应该调用存储库存储方法吗?

2 个答案:

答案 0 :(得分:2)

我不喜欢让存储库提交更改数据库的想法。

就我而言,xRepository.Add(x)仅将实体/ AR附加到当前工作单元。

要执行对db的实际提交,我在我的uow上调用commit。

例如

C#

using(var uow = UoW.Begin()
{
     var ar1Repo = new Ar1Repository(uow);
     var ar1 = ar1Repo.FindById(123); //fetch already persistent entity

     var ar1.MakeChangesToAr2();

     //both ar1 and ar2 are persistent and known by the UoW
     //so no need to add them to the repositories since they 
     //are already _in_ the repositories         

     uow.Commit();
}

或:

using(var uow = UoW.Begin()
{
     var ar1Repo = new Ar1Repository(uow);
     var ar2Repo = new Ar2Repository(uow);
     var ar2 = new AR2();
     var ar1 = new AR1(AR2);
     ar1.MakeChangesToAr2();

     //attach the new entities to the uow
     ar1Repo.Add(ar1);
     ar2Repo.Add(ar2);

     uow.Commit();
}

这样,您可以一次提交整批更改,而不是尝试对每个实体进行原子提交,而您可能会在提交对象图时遇到问题。

这个想法是基于Jimmy Nilssons在他的“应用领域驱动设计和模式”一书中的想法。

答案 1 :(得分:-1)

我在AR2中有一个名为Save()的方法。此方法将实例化存储库以保存自身。然后,AR1可以在AR2上进行更改后调用Save()方法。