2010-11-11 34 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

相關問題