2010-11-11 55 views

回答

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在他的着作“应用领域驱动设计和模式”中的想法。

+0

伟大的观点罗杰,但我不认为这回答的主要问题是是否可以在存储库上有一个实体调用方法。我认为普遍的共识是“不,不允许实体调用存储库方法”,因为它是持久性无知的间接突破,并使测试更加困难。 – jpierson 2011-03-21 13:30:21

-1

我想在AR2中有一个名为Save()的方法。该方法将实例化存储库以保存自己。然后,AR1可以调用AR2上的Save()方法。

+0

这真的是要走的路吗?这听起来不像它的域名的一部分。实体不应该知道他们正在被持续? – 2010-11-12 07:22:41

+0

这将使它更像是活动记录比真正的DDD – 2010-11-19 11:41:48

相关问题